首先我們先來瞭解下Ucenter登入步驟
1、使用者登入discuz,通過logging.php檔案中的函數uc_user_login對post過來的資料進行驗證,也就是對username和password進行驗證。
2、如果驗證成功,將調用位於uc_client下client.php檔案中的函數uc_user_synlogin,在這個函數中調用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。
3、然後這個函數後向Ucenter的index.php傳遞資料,index.php接受傳遞的資料,獲得model為user,action為synlogin的值。
4、然後Ucenter的index.php調用control目錄下的user.php類中的onsynlogin方法,通過foreach迴圈,以javascript的方式通知uc應用列表中開啟同步登陸的應用進行同步登入;即通過get方式傳遞給各個應用目錄中api下的uc.php一些資料。
5、uc.php接收通知並處理get過來的資料,並在函數synlogin(位於uc.php中)通過函數_authcode加密資料(預設以UC_KEY作為密鑰),用函數_setcookie設定cookie。
6、各個應用用對應的密鑰解碼上面設定的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個應用都設定了同步登陸之後 當你登陸一個應用 然後執行
複製代碼 代碼如下:
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自己會在後台把所有開啟同步登陸的應用都給迴圈遍曆一遍 然後 在頁面上輸出
複製代碼 代碼如下:
複製代碼 代碼如下:
類似這種的js代碼 就是發送給每個開啟同步登陸的應用 然後 每個開啟同步登陸的應用 的 回調檔案 uc.php 接受到後 會進行解密 解密好後 其實 你就可以自己來寫代碼了 這個uc.php回調檔案的代碼不一定非要按照他們的格式來寫 你也可以自己寫你自己的代碼 比如說我就是根據session來做同步登陸的
複製代碼 代碼如下:
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();
}
這樣 當使用者重新整理了別的應用頁面之後 就自動登陸了
注意 如果在UC裡面添加應用 提示通訊沒有成功 那麼原因很簡單 就是沒有找到你 http://xxxx/api/uc.php 這個檔案 只要有這個檔案在 那麼通訊 肯定會成功的
其實UC的原理很簡單 就是某個應用登陸後 然後後台輪詢發送給同步登陸的應用的回調檔案 回調檔案接收到使用者ID之後 產生cookie或者session然後進入登陸模式。
http://www.bkjia.com/PHPjc/824962.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/824962.htmlTechArticle首先我們先來瞭解下Ucenter登入步驟 1、使用者登入discuz,通過logging.php檔案中的函數uc_user_login對post過來的資料進行驗證,也就是對username和p...