<?phpfunction page_redirect($redirect_to){    if (headers_sent()){ // Use JavaScript to redirect if content has been previously sent (not recommended, but safe)        echo ‘<script language=”JavaScript” type=”text/javascript”>window.location=”;        echo $redirect_to;        echo ”;</script>’;    }else{    // Default Header Redirect        header(‘Location: ’ . $redirect_to);    }}?>

从http://openid.net/specs/openid-authentication-2_0-11.html 分析的流程+用例图

一、Initiation
RP提供登录窗体,使最终用户可以进行登录;输入框的名字约定为“openid_identifier” 以便于最终用户使用的代理可以进行自动完成。
二、Normalization
RP对最终用户提供的uid进行格式补全,默认使用http协议
三、Discovery
RP从用户提供的uid中发现OP的位置和CID;首先尝试使用xri协议,其次使用yadis进行发现,若都没有匹配则使用基本的html方式进行发现。
四、Establishing Associations
RP尝试向OP请求交互过程中使用的密钥,并在以后的交互过程用使用(HMAC-SHA1或HMAC-SHA256)形式进行加密传输。
五、Requesting Authentication
RP组织OP Url 并通知最终用户使用的UA转向OP发出验证身份的请求;传输过程中根据OP url中指定的协议,使用http或https进行交互。
XX、Authentication
OP对最终用户的身份进行验证,标准中没有强制使用哪种方式进行验证,由OP自行选择。
六、Responding to Authentication Requests
OP将验证结果经由最终用户的UA,转向到RP。
七、Verifying Assertions
RP对最终用户的UA的请求中携带的数据向OP方进行验证。

文中是几个根据自己理解画的图形
by fallseir blog.fallseir.com
关于SSO和CAS可以到这里 SSO(Single Sign-on) in Action(上篇)
http://www.blogjava.net/security/archive/2006/10/02/sso_in_action.html

从上面的文章中拷来的图形,重画了下,个人感觉清爽了些

上图是CAS v1的关键用例
user访问service1的服务,service1获取user的身份标记(check login),如果没有就重定向user到server去获取身份标记(sign on),如果有就拿着这个标记到server处去验证标记的真实性(check ticket),验证成功就证明用户已经登录了。

CAS v2的关键用例
只是比v1版多了一个service之间的交互方式,使用新的PT作为身份标识,PT在service1到server端验证用户标记时获取。
当然这里只是简要概述下SSO的CAS实现,而没有涉及CAS中比较重要的安全通信部分

关于Open ID 可以到这里 openid.net.cn
http://www.openid.net.cn/
如果你用的是IE 可以到这里看下 viso生成的Html版

open id 的v1版

核心用例只有几个
associate 与服务器通信获取用于加密通信的安全码
Immediate 向服务器验证用户身份是否正确,立即返回
setup 向服务器验证用户身份,和索要用户信息并等待服务器的回调
check authentication 到服务器端验证来自用户的信息是否正确

不过下面的流程,不仔细看可能就有些乱了

上图将的是open id 的v1版中的setup的流程

下面是最后一幅图了,描述了openid v2版的流程

感觉流程上没有什么大的变动,只是改了名字让流程更清晰和确定些
先到这里了

post by fallseir

技巧:博客圈的json输出 in feedsky
json: http://network.feedsky.com/test_fn/json?d=0&c=15&p=2&e=gbk&v=obj
feedsky发布了新的博客圈系统,并提供了json输出的支持
上面的代码就是我建的一个博客圈的json输出地址
d代表是否输出描述
c代表输出条数
p代表输出的页面(json版的支持分页显示!)
e代表输出的编码(建议使用utf-8或者gbk!)
v代表输出的变量名
比如这个地址的内容 (http://network.feedsky.com/test_fn/json?d=0&c=1&p=1&e=utf-8&v=obj)
稍微整理了下

obj={
title:’测试博客圈’,
description:’测试博客圈\ntesting…’,
is_page_end:”,
item_count:”,
items:[
{title:'笔记:构建分页导航',
pubDate:'Thu, 07 Jun 2007 16:32:13 +0800',
link:'http://item.feedsky.com/~feedsky/fallseir/~1247382/7460200/1223971/1/item.html'
}],
encoding:’utf-8′
};
obj->
title // 圈子标题
description // 圈子描述
is_page_end [...]

构建分页导航
-by fallseir

join_url 和 split_url 参看这里

echo multi_page($current_page_num,$is_page_end);
echo multi_page($current_page_num,false,$item_count);
echo multi_page($current_page_num,false,$item_count,$page_size);
echo multi_page($current_page_num,false,$item_count,$page_size,$req_uri);

function multi_page($page ,$is_page_end,$item_count=false,$page_size=10,$req_uri=false){
if(!$req_uri)
$req_uri=$_SERVER["REQUEST_URI"];
list($path,$args)=split_url($req_uri);
$html [...]