看了很多博文,终于明白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']);
}
在do_login.php 有
$_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]\t$member[uid]", 'ENCODE'), $cookietime);
}
ssetcookie('loginuser', $get['username'], $cookietime);
}
其中obclean();
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
这两 行是必须的
这样就实现了每个域下都有相应的cookie,同步登出亦如此。
function uc_user_synlogin($uid) {
}
uc_api_post('user', 'synlogin', array('uid'=>$uid)是打开ucenter下的指定action 这里是control/user.php的onsynlogin方法,同时传递参数uid,关于如何打开ucenter 函数在uc_api_post;
在onsynlogin方法中
function onsynlogout() {
onsynlogin 函数通过循环,对系统下的所有应用(在data/cache/setting.php)做JS调用
在js中对每个应用下的api/uc.php 进行访问并进行cookie设置
返回到uchome.在每 个应用下的api目录有个uc.php文件查找$action == 'synlogin'下面是进行cookie设置
function synlogin($get, $post) {
其中obclean();
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
这两 行是必须的
这样就实现了每个域下都有相应的cookie,同步登出亦如此。