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存儲的數據格式
相關文章
相關標籤/搜索