Servers 分类中的最新日记

Yahoo的OpenID登陆

| 引用通告(1)
前两次写了Windows Live ID当作OpenID使用的方法Google的OpenID的登陆,这次写Yahoo的OpenID的实现方法。

先说一下Yahoo的OpenID仅有Plaxo等几个网站可以获取用户属性,所以暂时不要考虑这个东西吧。

而且Yahoo还会出现了下面这段警告:
Warning: This website has not confirmed its identity with Yahoo! and might be fraudulent. Do not share any personal information with this website unless you are certain it is legitimate.
你是不是很郁闷呢?其实解决方法很简单,请参考:http://tihualong.javaeye.com/blog/309246
...

因为其他的OpenID提供者同时支持OpenID1.1与OpenID2.0协议,但是Yahoo的程序员像我们一样不喜欢考虑兼容性的问题。只支持OpenID2.0协议标准。

那么OpenID2.0协议标准有什么特殊的地方呢?

OpenID2.0中提出了一个新的东西叫做OpenID Relying Party discovery的,我们的问题就出在这个OpenID Relying Party discovery上。

先解释一下这个OpenID Relying Party discovery是什么东西。

当你重定向到OpenID提供者站点去请求认证的时候,OpenID提供者会使用这个叫做OpenID Relying Party discovery的机制自动验证return_to的URL处于指定的范围内,并且与OP通过realm参数获取到的XRDS文档中获取到的return_to的URL相同。

我是这么理解的:我的Consumer程序告诉了OP我的return_to地址是什么,但是OP不信任我,要通过我的realm参数(注意:这个地方是OP向RP发出的请求,所以要求你realm参数的url必须是外网的ip地址或者能通过外部的DNS查找到的域名)查找一个基于yadis协议的XRDS文档中的return_to地址,两个return_to地址相比较,如果相同,好,我相信你了,放行。(不知道这样理解有没有问题,我觉得应该没问题吧)

好,原理理解了。下面我们要做的就是:

1、 编写一个XRDS文档保存到你的网站上,存放成什么扩展名的没什么关系,但是你要保证Yahoo或者其他OP获取到这个文档的Content-Type是" application/xrds+xml",不然他们会认为这个文档不是他们要找的文档。

2、 将你第一步编写的XRDS文档的地址公布在你网站的首页,或者你的openid.realm参数指定的页面上(建议)

我们先来编写XRDS文档:(起名xrds.php)
<?php
header('Content-type: application/xrds+xml');
?>
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="1">
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
<URI>改成你的return_url地址</URI>
</Service>
</XRD>
</xrds:XRDS>

将你编写的XRDS文档的地址公布在openid.realm指定的页面,建议单独写一个页面维护,然后设置openid.realm参数为你创建的这个页面
<?php
header('X-XRDS-Location: 改成你的xrds.php地址');
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-XRDS-Location" content="改成你的xrds.php地址"/>
</head>
<body>
网页内容
</body>
</html>


if(empty($_REQUEST['openid_mode'])){
$openid_server = 'https://open.login.yahooapis.com/openid/op/auth';
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.mode'] = 'associate';
$data['openid.assoc_type'] = 'HMAC-SHA1';
$data['openid.session_type'] = 'no-encryption';
$AssocHandle = getAssociationHandle($openid_server.'?'.http_build_query($data));
setcookie('cookieAssocHandle', $AssocHandle);
unset($data);

$data['openid.assoc_handle'] = $AssocHandle;
$data['openid.ax.mode'] = 'fetch_request';
$data['openid.ax.required'] = 'attr1,attr2,attr3,attr4,attr5';
$data['openid.ax.type.attr1'] = 'http://axschema.org/contact/email';
$data['openid.ax.type.attr2'] = 'http://axschema.org/namePerson/first';
$data['openid.ax.type.attr3'] = 'http://axschema.org/namePerson/last';
$data['openid.ax.type.attr4'] = 'http://axschema.org/contact/country/home';
$data['openid.ax.type.attr5'] = 'http://axschema.org/pref/language';
$data['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.mode'] = 'checkid_setup';
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
$data['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
$data['openid.realm'] = $RealmUrl;
$data['openid.return_to'] = $AuthUrl;
$data['openid.sreg.optional'] = 'nickname,email,fullname,dob,gender,postcode,country,language,timezone';
$data['openid.sreg.policy_url'] = $PolicyUrl;
$data['openid.sreg.required'] = 'email';
$data['openid.trust_root'] = $RealmUrl;
//$data['xopenid_lang_pref'] = 'tw';

$LocationUrl = $openid_server.'?'.http_build_query($data);
}else{
if('id_res' == $_REQUEST['openid_mode']
&& $AssocHandle == $_REQUEST['openid_assoc_handle']){
$openid = !empty($_REQUEST['openid_identity']) ? formUrl($_REQUEST['openid_identity']) : formUrl($_REQUEST['openid_claimed_id']);
$email = $_REQUEST['openid_sreg_email'];
$fullname = $_REQUEST['openid_sreg_fullname'];
$nickname = $_REQUEST['openid_sreg_nickname'];
$timezone = $_REQUEST['openid_sreg_timezone'];
}
echo('<pre>');
echo("<a href=$LoginUrl>BACK</a>\n\n");
print_r($_REQUEST);
echo('</pre>');
}

注意:有部分函数和变量有遗漏,请参考Windows Live ID当作OpenID使用的方法Google的OpenID的登陆
去年这个时候还是7.0-RELEASE,几年5月2日就7.2-RELEASE,更新速度够可以的。

7.2-RELEASE修正了下列安全公告所指明的问题:
  1. lukemftpd 中的跨站请求伪造问题。
  2. OpenSSL 对格式不正确的签名检查存在问题。
  3. ntpd 密码学签名绕过问题。
  4. BIND DNSSEC 对格式不对的签名检查存在问题。
  5. telnetd 任意代码执行问题。
  6. 本地特权提升问题。
  7. db 中的信息泄露问题。
  8. OpenSSL 远程可触发的崩溃问题。

7.2-RELEASE对内核的改动:
  1. 内核调试器 ddb 新增了 show mount 子命令。
  2. FreeBSD DTrace 子系统新增了对于进程执行的探测点 (probe) 支持。
  3. [amd64] FreeBSD 内核虚拟地址空间增加到了 6GB。
  4. 对 jail(8) 子系统进行了更新。
  5. kld 支持从内核模块为 FreeBSD 系统调用翻译层安装 32-位 系统调用了。
  6. ktr 新增了 KTR_CALLOUT class 的 KTR 跟踪点, 用以描述 callout 回调完成执行。
  7. 用以对已经分配的 System V 共享内存进行记账的变量由 int 改为了 size_t。
  8. sysctl 叶节点新增了一个表示其为 MPSAFE 的标志。
  9. FreeBSD 32-位 系统调用翻译层新增了为 VFS_AIO 安装 32-位系统调用的支持。
  10. [amd64, i386] FreeBSD 虚拟内存子系统新增了针对应用程序的透明 superpages 支持; 应用程序的内存页会根据使用情况动态地升级为 superpage, 或反之降级为普通内存页, 而无须对程序代码进行任何修改。


详见:http://www.freebsd.org/zh_CN/releases/7.2R/relnotes-detailed.html
想找一个免费的跨平台代码编辑器,可以编写PHP代码就可以,但要支持FTP编辑,这样开发就也方便了,上班也可以,下班回家也可以。PSpad是不错,FTP编辑的功能不错,但是不能跨平台,是WIN应用的软件。其他的基本也是如此,很难实现跨平台,包括收费的。

有人介绍 PHPanywhere ,是B/S结构软件,跨平台没有问题,只要有游览器就可以了!但有致命的缺陷,就是要托管给PHPanywhere,你放心吗?我不放心,FTP的用户名和密码啊,高度危险啊!

而且,大陆客户用PHPanywhere速度超慢!速度很重要!

所以,PHPanywhere不可以做为开发工具!

onlinephpeditor_screenshot.jpg



VirtualBox安装FreeBSD

| 评论(2)
宿主机:WinXP sp3
VirtualBox 2.2.2
FreeBSD7.1-release

在XP下安装和使用VBOX我就不多说了,中文界面,很简单,比较傻瓜。注意的是VBOX只支持固定大小不超过4GB的虚拟硬盘,所以我就用3.99GB。

把FreeBSD7.1-release的ISO文件虚拟光驱,然后安装,方法同普通安装一致,见:http://wangblog.org/2008/09/freebsd.html

安装完成后,原本3.99GB的虚拟硬盘太小,我们在VBOX里再挂载一个虚拟硬盘。/usr/ports 是比较占空间的,同时在编译期间会占用很多空间,我们把 /usr/ports 挂载到另一个虚拟硬盘。
# dmesg
# mkdir /disk1
# mount /dev/ad1s1d /disk1
# ee /etc/fatab
添加
/dev/ad1s1d /disk1 ufs rw 3 3

# mkdir /disk1/usr
# cd /disk1/usr
# mv -i /usr/ports ./
# ln -s /disk1/usr/ports /usr/ports

虚拟机安装 FreeBSD用编译方法安装软件比较耗时耗资源,我们更多的采用pkg_add的方法。因此要加速。
# ee /root/.cshrc
添加
setenv PACKAGESITE ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-7.1-release/Latest/
注:ftp.jp.freebsd.org比较新,比较全,速度也可以。ftp.cn.freebsd.org速度好,但是更新慢。ftp.kr.freebsd.org也可以。

# source /root/.cshrc

如果要使用桌面的话,请用xfce,更轻巧。
# pkg_add -r xfce4
# cd /usr/ports/chinese/scim-pinyin/ && make install clean
# ee ~/.cshrc
添加
setenv LANG zh_CN.eucCN
setenv LC_CTYPE zh_CN.eucCN
setenv XMODIFIERS @im=SCIM
setenv GTK_IM_MODULE scim
# source ~/.cshrc
# echo "exec /usr/local/bin/scim &" >> ~/.xinitrc
# echo "exec /usr/local/bin/startxfce4" >> ~/.xinitrc
# pkg_add -r opera
# startx

桌面的中文化可以参考:http://wangblog.org/2008/10/freebsd-1.html

虚拟机安装FreeBSD,跟宿主机连接的方法:
设置 => 网络 => 连接方式:Bridged Adapter
虚拟机安装FreeBSD,跟宿主机连接的方法

VBOX作为开源的虚拟机系统,虽然占用CPU经常100%,但也比到处找破解方法的VM好!

鄙视收费软件!

鄙视有开源的替代软件,还强迫自己用破解收费软件的...
session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");

以上完成了sessions的自定义,sess_gc是处理垃圾回收的。

sess_gc在sessions中是指清理过期的session数据,影响的参数有:session.gc_maxlifetime被视为垃圾前的生存期,超过此时间没有动作,数据会被清走。

注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的。如果session.gc_probability 和 session.gc_divisor 都设为1的话,即每次都执行!

Mr Wang

王炜,现在福建泉州从事 B2C 电子商务。爱好编程,业余时间在 FreeBSD / Apache / PHP / PostgerSQL 平台开发 B/S 架构的免费软件。

Follow Google Buzz Twitter Facebook Sina

收藏王炜's Blog

Bookmark and Share

关于此归档

这里是分类Servers中的最新日记。

上一个分类Our KeepAccounts

下一个分类Web

首页归档页可以看到最新的日记和所有日记。