牛骨文教育服务平台(让学习变的简单)
博文笔记

UCenter跨域、单点登陆机制分析

创建时间:2014-06-13 投稿人: 浏览次数:439
看了很多博文,终于明白ucenter怎么和uchome进行通信了,首先要明白 uchome 是通过cookie技术 去验证有无登录的,在登录成功后,默认会产生uchome_loginuser和 uchome_auth的Cookie值,而这两个cookie 是有作用域的,所以要想其他的域也有登录名,必须跨域传 用户名和密码等,在进行验证;下面介绍下如何实现的?
   uchome登陆时访问 source/do_login.php 的getpassport函数,getpassport通过uc_client 直接连ucenter的数据库,实现当前站点的登陆,会产生自己域的cookie,实现自己域下面用户登录验证;
在do_login.php 有
     //同步登录
    if ($_SCONFIG["uc_status"])
    {
        include_once S_ROOT . "./uc_client/client.php";
        $ucsynlogin = uc_user_synlogin($setarr["uid"]);
    }
$_SCONFIG["uc_status"]为 uc状态,这里已在common.php 中有定义,如果不是当前应用则为1,然后看client.php的uc_user_synlogin函数

function uc_user_synlogin($uid) {
    $uid = intval($uid);
    $return = uc_api_post("user", "synlogin", array("uid"=>$uid));
    return $return;
}
uc_api_post("user", "synlogin", array("uid"=>$uid)是打开ucenter下的指定action 这里是control/user.php的onsynlogin方法,同时传递参数uid,关于如何打开ucenter 函数在uc_api_post;
在onsynlogin方法中
function onsynlogout() {
        $this->init_input();
        if($this->app["synlogin"]) {
            $synstr = "";
            foreach($this->cache["apps"] as $appid => $app) {
                if($app["synlogin"] && $app["appid"] != $this->app["appid"]) {
                    $synstr .= "<script type="text/javascript" src="".$app["url"]."/api/".$app["apifilename"]."?time=".$this->time."&code=".urlencode($this->authcode("action=synlogout&time=".$this->time, "ENCODE", $app["authkey"]))."" reload="1"></script>";
                }
            }
            return $synstr;
        }
        return "";
    }
onsynlogin 函数通过循环,对系统下的所有应用(在data/cache/setting.php)做JS调用
在js中对每个应用下的api/uc.php 进行访问并进行cookie设置
返回到uchome.在每 个应用下的api目录有个uc.php文件查找$action == "synlogin"下面是进行cookie设置
function synlogin($get, $post) {
        global $_SGLOBAL;
       
        if(!API_SYNLOGIN) {
            return API_RETURN_FORBIDDEN;
        }
   

        obclean();
        header("P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"");
   
        $cookietime = 31536000;
        $uid = intval($get["uid"]);
        $query = $_SGLOBAL["db"]->query("SELECT uid, username, password FROM ".tname("member")." WHERE uid="$uid"");
        if($member = $_SGLOBAL["db"]->fetch_array($query)) {
            include_once S_ROOT."./source/function_space.php";
            $member = saddslashes($member);
            $space = insertsession($member);

            ssetcookie("auth", authcode("$member[password] $member[uid]", "ENCODE"), $cookietime);
      
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。