UCenter跨域、单点登陆机制分析
看了很多博文,终于明白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"]);
}
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);
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);
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: mysql最大值,最小值,总和查询与计数查询
- 下一篇: 使用mysql实现1-12月份查询统计
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2