ucenter通讯、登陆原理

一直在用康盛的产品,天然少不了单点登录,最近从新研究了下ucenter的机制,其实它的基本原理就一句话:跨域设置用户信息

下面只对用户登录作比较详细说明,其余注册、PM等操做其实原理差很少php


1:用户登录

do_login.php[uchome]

$passport = getpassport($username, $password);

此处操做调用了uc_client下client.php的 uc_user_login($username, $password);

此函数又调用了call_user_func(UC_API_FUNC, 'user', 'login', array())

call_user_func回调UC_API_FUNC, 此处为uc_api_mysql函数,即调用 uc_api_mysql函数,后面的'user', 'login', array()是参数

而uc_api_mysql的实质是调用uc_client的controller下的user控制器,而后执行onlogin方法

该方法则是判断用户提交信息是否正确,而后返回对应uc_member表的uid

总结:

(1):uchome的用户登录主要经过uc_client进行操做,判断用户信息是否正确,最终返回对应于uc表的uid, 供单点登录用

(2):整合本身应用的时候能够没必要这么复杂,登录彻底能够走本身的模式,只是要返回下uc表的uid,供单点登录用便可 

2:单点登录

include 'uc_client/client.php';


uc_user_synlogin($uid);



uc_user_synlogin内部则调用uc_api_post('user', 'synlogin', array('uid'=>$uid));

uc_api_post函数的做用是将将数据经过socket发送到ucenter

uc_api_post同时调用uc_api_requestdata和uc_fopen2函数

uc_api_requestdata构造发送给用户中心的请求数据

uc_fopen2远程打开URL,本质是调用uc_fopen函数,经过 fsockopen远程打开ucenter/index.php,而且传递参数,调用user控制器执行onsynlogin() 方法,

onsynlogin()读取缓存, 缓存文件保留有各单点登录应用的基本信息 [好比bbs supersite的基本信息]

而后循环经过JS调用不一样应用下api下的uc.php

下一步转移到各应用下的uc.php调用synlogin($get, $post)

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

setcookie();

从而实现跨域设置cookie

P3p做用:

好比有2个应用,a.hxwan.com 和 b.hxan.com 另外有个公用的uceter.hxwan.com

uceter.hxwan.com经过JS跨域调用a.hxwan.com b.hxan.com,

这两个脚本都作了设置cookie 的功能,但为了跨域,考虑到不一样浏览器[主要考虑IE6],必须调用P3P,实现成功跨域

总结:总的 来讲,UCENTER一站登录原理是socket远程打开uceter, 而且传输已经登录的公用UID,ucnter循环经过JS调用各应用下的api,在各个地方设置cookie,而保证cookie通用的则是P3P处理[注意不一样应用下的api脚本不同,bbs的uc.php不一样于uchome的uc.php]mysql


3:整合本身的应用

(1)下载UCENTER,而且打好UCENTER的数据表,uc_members表的做用是存储通用的ID数据

(2)在本身的应用下增长uc_client 和 api,这两个目录下的文件须要根据实际状况进行更改

(3)进入ucenter的后台,添加单点登录的应用

(4)添加单点登录成功后会出现一些配置信息,在本身的应用下添加config.php, 而且复制配置信息,增长一句 $database = 'mysql';

新版本的UC范例,通讯不成功是由于范例目录下的那个config.inc.php少了这句 $database = 'mysql';

致使连不上 include/下的数据库类文件。jquery

至此,基本操做已经完成,另外具体状况则按照本身的应用进行不一样的操做

4:应用整合其余办法

其实也能够不走单点登录,全站统一个注册、登录接口便可,注意各个应用cookie的前缀要同样,考虑跨域的话能够用jquery的jsonp, 此时的注册、登录得本身写一套,注册、登录的模式跟本来应用同样就能够啦,好比cookie的加密方式、cookie的做用域以及cookie存储的数据格式
相关文章
相关标签/搜索