UCenter的應用整合與單點登錄分析


一直在用康盛的產品,自然少不了單點登陸,最近重新研究了下ucenter的機制,其實它的基本原理就一句話:跨域設置用戶信息。下面只對用戶登陸做比較詳細說明,其他注冊、PM等操作其實原理差不多。

用戶登陸

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,供單點登陸用即可。 

單點登陸

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.nowamagic.net 和 b.nowamagic.net 另外有個公用的uceter.nowamagic.net,uceter.nowamagic.net通過JS跨域調用a.nowamagic.net b.nowamagic.net,這兩個腳本都做了設置cookie 的功能,但為了跨域,考慮到不同瀏覽器[主要考慮IE6],必須調用P3P,實現成功跨域。

總結:總的來說,UCENTER一站登陸原理是socket遠程打開ucenter,並且傳輸已經登陸的公用UID,ucnter循環通過JS調用各應用下的api,在各個地方設置cookie,而保證cookie通用的則是P3P處理[注意不同應用下的api腳本不一樣,bbs的uc.php不同於uchome的uc.php]。

整合自己的應用

  1. 下載UCENTER,並且打好UCENTER的數據表,uc_members表的作用是存儲通用的ID數據。
  2. 在自己的應用下增加uc_client 和 api,這兩個目錄下的文件需要根據實際情況進行更改。
  3. 進入ucenter的后台,添加單點登陸的應用。
  4. 添加單點登陸成功后會出現一些配置信息,在自己的應用下添加config.php, 並且復制配置信息,增加一句 $database = 'mysql';

新版本的UC范例,通信不成功是因為范例目錄下的那個config.inc.php少了這句 $database = 'mysql';
導致連不上 include/下的數據庫類文件。

至此,基本操作已經完成,另外具體情況則按照自己的應用進行不同的操作。

應用整合其他辦法

其實也可以不走單點登陸,全站統一個注冊、登陸接口即可,注意各個應用cookie的前綴要一樣,考慮跨域的話可以用jquery的jsonp,此時的注冊、登陸得自己寫一套,注冊、登陸的模式跟原本應用一樣就可以啦,比如cookie的加密方式、cookie的作用域以及cookie存儲的數據格式。

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM