UCenter的應(yīng)用整合與單點(diǎn)登錄實(shí)現(xiàn)代碼 有需要了解的朋友可參考一下。
一直在用康盛的產(chǎn)品,自然少不了單點(diǎn)登陸,最近重新研究了下ucenter的機(jī)制,其實(shí)它的基本原理就一句話:跨域設(shè)置用戶(hù)信息。下面只對(duì)用戶(hù)登陸做比較詳細(xì)說(shuō)明,其他注冊(cè)、PM等操作其實(shí)原理差不多。
用戶(hù)登陸
do_login.php[uchome]
$passport = getpassport($username, $password);
此處操作調(diào)用了uc_client下client.php的
uc_user_login($username, $password);
此函數(shù)又調(diào)用了
call_user_func(UC_API_FUNC, 'user', 'login', array())
call_user_func回調(diào)UC_API_FUNC, 此處為uc_api_mysql函數(shù),即調(diào)用 uc_api_mysql函數(shù),后面的'user', 'login', array()是參數(shù)。而uc_api_mysql的實(shí)質(zhì)是調(diào)用uc_client的controller下的user控制器,然后執(zhí)行onlogin方法。
該方法則是判斷用戶(hù)提交信息是否正確,然后返回對(duì)應(yīng)uc_member表的uid。
總結(jié):
1.uchome的用戶(hù)登陸主要通過(guò)uc_client進(jìn)行操作,判斷用戶(hù)信息是否正確,最終返回對(duì)應(yīng)于uc表的uid, 供單點(diǎn)登陸用。
2.整合自己應(yīng)用的時(shí)候可以不必這么復(fù)雜,登陸完全可以走自己的模式,只是要返回下uc表的uid,供單點(diǎn)登陸用即可。
單點(diǎn)登陸
include 'uc_client/client.php';
uc_user_synlogin($uid);uc_user_synlogin
內(nèi)部則調(diào)用
uc_api_post('user', 'synlogin', array('uid'=>$uid));
uc_api_post函數(shù)的作用是將將數(shù)據(jù)通過(guò)socket發(fā)送到ucenter。
uc_api_post同時(shí)調(diào)用uc_api_requestdata和uc_fopen2函數(shù)。
uc_api_requestdata構(gòu)造發(fā)送給用戶(hù)中心的請(qǐng)求數(shù)據(jù)。
uc_fopen2遠(yuǎn)程打開(kāi)URL,本質(zhì)是調(diào)用uc_fopen函數(shù),通過(guò) fsockopen遠(yuǎn)程打開(kāi)ucenter/index.php,并且傳遞參數(shù),調(diào)用user控制器執(zhí)行onsynlogin() 方法,onsynlogin()讀取緩存,緩存文件保留有各單點(diǎn)登陸應(yīng)用的基本信息 [比如bbs supersite的基本信息]。然后循環(huán)通過(guò)JS調(diào)用不同應(yīng)用下api下的uc.php。
下一步轉(zhuǎn)移到各應(yīng)用下的uc.php調(diào)用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();從而實(shí)現(xiàn)跨域設(shè)置cookie
P3p作用:
比如有2個(gè)應(yīng)用,a.nowamagic.net 和 b.nowamagic.net 另外有個(gè)公用的uceter.nowamagic.net,uceter.nowamagic.net通過(guò)JS跨域調(diào)用a.nowamagic.net b.nowamagic.net,這兩個(gè)腳本都做了設(shè)置cookie 的功能,但為了跨域,考慮到不同瀏覽器[主要考慮IE6],必須調(diào)用P3P,實(shí)現(xiàn)成功跨域。Vevb.com
總結(jié):總的來(lái)說(shuō),UCENTER一站登陸原理是socket遠(yuǎn)程打開(kāi)ucenter,并且傳輸已經(jīng)登陸的公用UID,ucnter循環(huán)通過(guò)JS調(diào)用各應(yīng)用下的api,在各個(gè)地方設(shè)置cookie,而保證cookie通用的則是P3P處理[注意不同應(yīng)用下的api腳本不一樣,bbs的uc.php不同于uchome的uc.php]。
整合自己的應(yīng)用
1.下載UCENTER,并且打好UCENTER的數(shù)據(jù)表,uc_members表的作用是存儲(chǔ)通用的ID數(shù)據(jù)。
2.在自己的應(yīng)用下增加uc_client 和 api,這兩個(gè)目錄下的文件需要根據(jù)實(shí)際情況進(jìn)行更改。
3.進(jìn)入ucenter的后臺(tái),添加單點(diǎn)登陸的應(yīng)用。
4.添加單點(diǎn)登陸成功后會(huì)出現(xiàn)一些配置信息,在自己的應(yīng)用下添加config.php, 并且復(fù)制配置信息,增加一句 $database = 'mysql';
新版本的UC范例,通信不成功是因?yàn)榉独夸浵碌哪莻€(gè)config.inc.php少了這句 $database = 'mysql';
導(dǎo)致連不上 include/下的數(shù)據(jù)庫(kù)類(lèi)文件。
至此,基本操作已經(jīng)完成,另外具體情況則按照自己的應(yīng)用進(jìn)行不同的操作。
應(yīng)用整合其他辦法
其實(shí)也可以不走單點(diǎn)登陸,全站統(tǒng)一個(gè)注冊(cè)、登陸接口即可,注意各個(gè)應(yīng)用cookie的前綴要一樣,考慮跨域的話可以用jquery的jsonp,此時(shí)的注冊(cè)、登陸得自己寫(xiě)一套,注冊(cè)、登陸的模式跟原本應(yīng)用一樣就可以啦,比如cookie的加密方式、cookie的作用域以及cookie存儲(chǔ)的數(shù)據(jù)格式。
新聞熱點(diǎn)
疑難解答