笔记

笔记:open id 之二

从http://openid.net/specs/openid-authentication-2_0-11.html 分析的流程+用例图
openid v2-11 flow
一、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方进行验证。


笔记:Open ID 之我见

文中是几个根据自己理解画的图形
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
从上面的文章中拷来的图形,重画了下,个人感觉清爽了些 ;)

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

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

不过下面的流程,不仔细看可能就有些乱了
open id v1 2
上图将的是open id 的v1版中的setup的流程

下面是最后一幅图了,描述了openid v2版的流程
openid v2
感觉流程上没有什么大的变动,只是改了名字让流程更清晰和确定些
先到这里了 :)

post by fallseir


技巧:博客圈的json输出 in feedsky

技巧:博客圈的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 // 是否达到页尾
   item_count // 总条数,可能为空,代表还没有得到
   items-> // 文章集合
    [0]-> // 第一篇
      title // 文章标题
      pubDate // 发布时间
      description // 内容
      link // 链接
   encoding // 输出编码

一段用来输出的代码
function renderfeed(feed,box_id){
	if(typeof(box_id)=="string"){
		box=document.getElementById(box_id);
	}else{
		box=box_id;
	}
	html="";
	for(var i=0;i<2;i++){
		var item=feed.items[i];
		html+='<p style="margin-bottom:8px;"><a href="'+item.link+'" class="t">'+item.title+"</a><br />";
		if(feed.items.length==1){
			if(item.description.length>150){
				item.description=item.description.substring(0,150)+"... ...";
			}
		}else{
			if(item.description.length>60){
				item.description=item.description.substring(0,60)+"... ...";
			}
		}
		html+=item.description;
		html+='<span class="orange_12"></span> <a href="'+item.link+'"></a></p><br/>';
	}
	//html+="<p> </p>";
	box.innerHTML=html;
	return 1;
}

笔记:构建分页导航

构建分页导航
-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 = "";
        if($item_count&&$item_count>$page_size){
            $p_count=ceil(($item_count-1)/$page_size);
            $s=$page-3;
            if($s<=1){
                $s=1;
            }else{
                $i=1;
                unset($args["p"]);
                $url=join_url($path,$args);
                $html .= "<a href="{$url}">$i</a> ";
                if($s>2)
                    $html.=".. ";
            }
            $e=$page+3;
            $end_str="";
            if($e>=$p_count){
                $e=$p_count;
            }else{
                $i=$p_count;
                $args["p"]=$i;
                $url=join_url($path,$args);
                $end_str= " <a href="{$url}">$i</a>";
                if(($e+1)<$p_count)
                    $end_str="..".$end_str;
            }
            for($i=$s;$i<=$e;$i++){
                if($i==$page){
                    $html .= "<b>$i</b> ";
                }else{
                    $args["p"]=$i;
                    if($i==1)
                        unset($args["p"]);
                    $url=join_url($path,$args);
                    $html .= "<a href="{$url}">$i</a> ";
                }
            }
            $html.=$end_str;
        }else{
            if($page>1){
                $args["p"]=$page-1;
                if($page-1==1)
                    unset($args["p"]);
                $url=join_url($path,$args);
                $html .= "<a href="{$url}">上一页</a> ";
            }
            if(!$is_page_end){
                $args["p"]=$page+1;
                $url=join_url($path,$args);
                $html .= " <a href="{$url}" >下一页</a>";
            }
        }
        return $html;
    }

笔记:从url中分离query数据

从url中分离query数据
-by fallseir

$req_url=$_SERVER["REQUEST_URI"]; // 获取当前url
list($req_path,$req_queries)=split_url($req_url); // 分离出地址和参数
$value=$req_queries["arg"]; //获取指定参数的值
$req_queries["page"]=2;//设置参数的值
unset($req_queries["arg"]);//清除指定参数

$new_url=join_url($req_path,$req_queries); // 重新组合成完整的地址

function split_url($url){
    $req_path=$url;
    $req_queries=array();

    if(strpos($url,"?")!==false){
        list($req_path,$req_query)=split("\?",$url,2);
        foreach(split("&",$req_query) as $query){
            list($q,$v)=split("=",$query,2);
            if(array_key_exists($q,$req_queries)){
                if(is_array($req_queries[$q])){
                    $req_queries[$q][]=$v;
                }else{
                    $req_queries[$q]=array($req_queries[$q],$v);
                }
            }else{
                $req_queries[$q]=$v;
            }
        }
    }
    return array($req_path,$req_queries);
}
function join_url($path,$queries=false){
    $url=$path;
    if($queries&&is_array($queries)&&(count($queries)>0)){
        $qs=array();
        foreach($queries as $k=>$v){
            if(is_array($v)){
                array_unique($v);
                foreach($v as $t){
                    $qs[]=sprintf("%s=%s",$k,$t);
                }
            }else{
                $qs[]=sprintf("%s=%s",$k,$v);
            }
        }
        if(count($qs)>0){
            $url.="?".join("&",$qs);
        }
    }
    return $url;
}

Copyright © 1996-2010 飞扬轻狂's blog. All rights reserved.
iDream theme by Templates Next | Powered by WordPress