首先咱們先來了解下 Ucenter登陸步驟
一、用戶登陸discuz,經過logging.php文件中的函數uc_user_login對post過來的數據進行驗證,也就是對username和password進行驗證。
二、若是驗證成功,將調用位於uc_client下client.php文件中的函數uc_user_synlogin,在這個函數中調用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。
三、而後這個函數後向Ucenter的index.php傳遞數據,index.php接受傳遞的數據,得到model爲user,action爲synlogin的值。
四、而後Ucenter的index.php調用control目錄下的user.php類中的onsynlogin方法,經過foreach循環,以javascript的方式通知uc應用列表中開啓同步登錄的應用進行同步登陸;即經過get方式傳遞給各個應用目錄中api下的uc.php一些數據。
五、uc.php接收通知並處理get過來的數據,並在函數synlogin(位於uc.php中)經過函數_authcode加密數據(默認以UC_KEY做爲密鑰),用函數_setcookie設置cookie。
六、各個應用用對應的密鑰解碼上面設置的cookie,獲得用戶id等數據;經過這個值來判斷用戶是否通過其它應用登陸過,從而讓用戶能夠自動登錄。
應用程序的logging.php ------>uc_client中的client.php------>Ucenter------>應用程序中api/uc.php
其實Ucenter實現同步登錄的原理就是cookie,一個應用登錄成功以後,向Ucenter傳遞數據,讓Ucenter通知其餘的應用也設置cookie,這樣用戶在訪問其餘應用的時候經過已經設置好的cookie實現自動登錄。瞭解了Ucenter的同步原理,再遇到沒法同步登錄,或者開發一些與UCenter接口的時候就會容易不少。
大體步驟 首先咱們要先安裝 ucenter 而後把uc_client 這個文件夾複製到本身的項目裏面去 而後呢在配置幾個文件
client.php至關於函數庫
uc.php至關於回調文件
還有一個 config.inc.php 是配置文件
當你有2個應用都設置了同步登錄以後 當你登錄一個應用 而後執行
[php] view plain copy
include './config.inc.php';
include './uc_client/client.php';
$usernames="feiye";
$passwords="789123";
list($uid, $username, $password, $email) = uc_user_login($usernames, $passwords);
if($uid > 0) {
setcookie("username",$username,time()+intval(24*3600));
echo uc_user_synlogin($uid);
echo '登陸成功';
} elseif($uid == -1) {
echo '用戶不存在,或者被刪除';
} elseif($uid == -2) {
echo '密碼錯';
} else {
echo '未定義';
}
uc_user_synlogin() 這個函數 表明着 要同步登錄到其餘全部開啓同步登錄的函數 uc本身會在後臺把全部開啓同步登錄的應用都給循環遍歷一遍 而後 在頁面上輸出
[html] view plain copy
<script type="text/javascript" src="http://127.0.0.70/api/uc.php?time=1374540644&code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script>
[html] view plain copy
<script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>
相似這種的js代碼 就是發送給每一個開啓同步登錄的應用 而後 每一個開啓同步登錄的應用 的 回調文件 uc.php 接受到後 會進行解密 解密好後 其實 你就能夠本身來寫代碼了 這個uc.php回調文件的代碼不必定非要按照他們的格式來寫 你也能夠本身寫你本身的代碼 好比說我就是根據session來作同步登錄的
[php] view plain copy
function synlogin($get, $post) {
$uid = $get['uid'];
$username = $get['username'];
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie('gwyy',$username,time()+3600,'/','127.0.0.71');
_setcookie('Example_auth', _authcode($uid."\t".$username, 'ENCODE'));
$_SESSION['username'] = $username;
$_SESSION['uid'] = $uid;
}
function synlogout($get, $post) {
if(!API_SYNLOGOUT) {
return API_RETURN_FORBIDDEN;
}
//note 同步登出 API 接口
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
_setcookie('Example_auth', '', -86400 * 365);
unset($_SESSION['username']);
unset($_SESSION['uid']);
session_destroy();
}
這樣 當用戶刷新了別的應用頁面以後 就自動登錄了javascript