一直在用康盛的產品,自然少不了單點登陸,最近重新研究了下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。
總結:
- uchome的用戶登陸主要通過uc_client進行操作,判斷用戶信息是否正確,最終返回對應於uc表的uid, 供單點登陸用。
- 整合自己應用的時候可以不必這么復雜,登陸完全可以走自己的模式,只是要返回下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]。
整合自己的應用
- 下載UCENTER,並且打好UCENTER的數據表,uc_members表的作用是存儲通用的ID數據。
- 在自己的應用下增加uc_client 和 api,這兩個目錄下的文件需要根據實際情況進行更改。
- 進入ucenter的后台,添加單點登陸的應用。
- 添加單點登陸成功后會出現一些配置信息,在自己的應用下添加config.php, 並且復制配置信息,增加一句 $database = 'mysql';
新版本的UC范例,通信不成功是因為范例目錄下的那個config.inc.php少了這句 $database = 'mysql';
導致連不上 include/下的數據庫類文件。
至此,基本操作已經完成,另外具體情況則按照自己的應用進行不同的操作。
應用整合其他辦法
其實也可以不走單點登陸,全站統一個注冊、登陸接口即可,注意各個應用cookie的前綴要一樣,考慮跨域的話可以用jquery的jsonp,此時的注冊、登陸得自己寫一套,注冊、登陸的模式跟原本應用一樣就可以啦,比如cookie的加密方式、cookie的作用域以及cookie存儲的數據格式。