單點(diǎn)登錄 Ucenter示例分析
更新時間:2013年10月29日 16:15:00 作者:
正如標(biāo)題所言,需要了解下Ucenter登錄步驟,之后在進(jìn)行有效的分析,下面有個不錯的示例,感興趣的朋友可以參考下
首先我們先來了解下Ucenter登錄步驟
1、用戶登錄discuz,通過logging.php文件中的函數(shù)uc_user_login對post過來的數(shù)據(jù)進(jìn)行驗(yàn)證,也就是對username和password進(jìn)行驗(yàn)證。
2、如果驗(yàn)證成功,將調(diào)用位于uc_client下client.php文件中的函數(shù)uc_user_synlogin,在這個函數(shù)中調(diào)用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。
3、然后這個函數(shù)后向Ucenter的index.php傳遞數(shù)據(jù),index.php接受傳遞的數(shù)據(jù),獲得model為user,action為synlogin的值。
4、然后Ucenter的index.php調(diào)用control目錄下的user.php類中的onsynlogin方法,通過foreach循環(huán),以javascript的方式通知uc應(yīng)用列表中開啟同步登陸的應(yīng)用進(jìn)行同步登錄;即通過get方式傳遞給各個應(yīng)用目錄中api下的uc.php一些數(shù)據(jù)。
5、uc.php接收通知并處理get過來的數(shù)據(jù),并在函數(shù)synlogin(位于uc.php中)通過函數(shù)_authcode加密數(shù)據(jù)(默認(rèn)以UC_KEY作為密鑰),用函數(shù)_setcookie設(shè)置cookie。
6、各個應(yīng)用用對應(yīng)的密鑰解碼上面設(shè)置的cookie,得到用戶id等數(shù)據(jù);通過這個值來判斷用戶是否經(jīng)過其它應(yīng)用登錄過,從而讓用戶可以自動登陸。
應(yīng)用程序的logging.php ------>uc_client中的client.php------>Ucenter------>應(yīng)用程序中api/uc.php
其實(shí)Ucenter實(shí)現(xiàn)同步登陸的原理就是cookie,一個應(yīng)用登陸成功之后,向Ucenter傳遞數(shù)據(jù),讓Ucenter通知其他的應(yīng)用也設(shè)置cookie,這樣用戶在訪問其他應(yīng)用的時候通過已經(jīng)設(shè)置好的cookie實(shí)現(xiàn)自動登陸。了解了Ucenter的同步原理,再遇到無法同步登陸,或者開發(fā)一些與UCenter接口的時候就會容易很多。
大致步驟 首先我們要先安裝 ucenter 然后把uc_client 這個文件夾復(fù)制到自己的項(xiàng)目里面去 然后呢在配置幾個文件
client.php相當(dāng)于函數(shù)庫
uc.php相當(dāng)于回調(diào)文件
還有一個 config.inc.php 是配置文件
當(dāng)你有2個應(yīng)用都設(shè)置了同步登陸之后 當(dāng)你登陸一個應(yīng)用 然后執(zhí)行
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() 這個函數(shù) 代表著 要同步登陸到其他所有開啟同步登陸的函數(shù) uc自己會在后臺把所有開啟同步登陸的應(yīng)用都給循環(huán)遍歷一遍 然后 在頁面上輸出
<script type="text/javascript" src="http://127.0.0.70/api/uc.php?time=1374540644&code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script>
<script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>
類似這種的js代碼 就是發(fā)送給每個開啟同步登陸的應(yīng)用 然后 每個開啟同步登陸的應(yīng)用 的 回調(diào)文件 uc.php 接受到后 會進(jìn)行解密 解密好后 其實(shí) 你就可以自己來寫代碼了 這個uc.php回調(diào)文件的代碼不一定非要按照他們的格式來寫 你也可以自己寫你自己的代碼 比如說我就是根據(jù)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();
}
這樣 當(dāng)用戶刷新了別的應(yīng)用頁面之后 就自動登陸了
注意 如果在UC里面添加應(yīng)用 提示通信沒有成功 那么原因很簡單 就是沒有找到你 http://xxxx/api/uc.php 這個文件 只要有這個文件在 那么通信 肯定會成功的
其實(shí)UC的原理很簡單 就是某個應(yīng)用登陸后 然后后臺輪詢發(fā)送給同步登陸的應(yīng)用的回調(diào)文件 回調(diào)文件接收到用戶ID之后 生成cookie或者session然后進(jìn)入登陸模式。
1、用戶登錄discuz,通過logging.php文件中的函數(shù)uc_user_login對post過來的數(shù)據(jù)進(jìn)行驗(yàn)證,也就是對username和password進(jìn)行驗(yàn)證。
2、如果驗(yàn)證成功,將調(diào)用位于uc_client下client.php文件中的函數(shù)uc_user_synlogin,在這個函數(shù)中調(diào)用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。
3、然后這個函數(shù)后向Ucenter的index.php傳遞數(shù)據(jù),index.php接受傳遞的數(shù)據(jù),獲得model為user,action為synlogin的值。
4、然后Ucenter的index.php調(diào)用control目錄下的user.php類中的onsynlogin方法,通過foreach循環(huán),以javascript的方式通知uc應(yīng)用列表中開啟同步登陸的應(yīng)用進(jìn)行同步登錄;即通過get方式傳遞給各個應(yīng)用目錄中api下的uc.php一些數(shù)據(jù)。
5、uc.php接收通知并處理get過來的數(shù)據(jù),并在函數(shù)synlogin(位于uc.php中)通過函數(shù)_authcode加密數(shù)據(jù)(默認(rèn)以UC_KEY作為密鑰),用函數(shù)_setcookie設(shè)置cookie。
6、各個應(yīng)用用對應(yīng)的密鑰解碼上面設(shè)置的cookie,得到用戶id等數(shù)據(jù);通過這個值來判斷用戶是否經(jīng)過其它應(yīng)用登錄過,從而讓用戶可以自動登陸。
應(yīng)用程序的logging.php ------>uc_client中的client.php------>Ucenter------>應(yīng)用程序中api/uc.php
其實(shí)Ucenter實(shí)現(xiàn)同步登陸的原理就是cookie,一個應(yīng)用登陸成功之后,向Ucenter傳遞數(shù)據(jù),讓Ucenter通知其他的應(yīng)用也設(shè)置cookie,這樣用戶在訪問其他應(yīng)用的時候通過已經(jīng)設(shè)置好的cookie實(shí)現(xiàn)自動登陸。了解了Ucenter的同步原理,再遇到無法同步登陸,或者開發(fā)一些與UCenter接口的時候就會容易很多。
大致步驟 首先我們要先安裝 ucenter 然后把uc_client 這個文件夾復(fù)制到自己的項(xiàng)目里面去 然后呢在配置幾個文件
client.php相當(dāng)于函數(shù)庫
uc.php相當(dāng)于回調(diào)文件
還有一個 config.inc.php 是配置文件
當(dāng)你有2個應(yīng)用都設(shè)置了同步登陸之后 當(dāng)你登陸一個應(yīng)用 然后執(zhí)行
復(fù)制代碼 代碼如下:
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() 這個函數(shù) 代表著 要同步登陸到其他所有開啟同步登陸的函數(shù) uc自己會在后臺把所有開啟同步登陸的應(yīng)用都給循環(huán)遍歷一遍 然后 在頁面上輸出
復(fù)制代碼 代碼如下:
<script type="text/javascript" src="http://127.0.0.70/api/uc.php?time=1374540644&code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script>
復(fù)制代碼 代碼如下:
<script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>
類似這種的js代碼 就是發(fā)送給每個開啟同步登陸的應(yīng)用 然后 每個開啟同步登陸的應(yīng)用 的 回調(diào)文件 uc.php 接受到后 會進(jìn)行解密 解密好后 其實(shí) 你就可以自己來寫代碼了 這個uc.php回調(diào)文件的代碼不一定非要按照他們的格式來寫 你也可以自己寫你自己的代碼 比如說我就是根據(jù)session來做同步登陸的
復(fù)制代碼 代碼如下:
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();
}
這樣 當(dāng)用戶刷新了別的應(yīng)用頁面之后 就自動登陸了
注意 如果在UC里面添加應(yīng)用 提示通信沒有成功 那么原因很簡單 就是沒有找到你 http://xxxx/api/uc.php 這個文件 只要有這個文件在 那么通信 肯定會成功的
其實(shí)UC的原理很簡單 就是某個應(yīng)用登陸后 然后后臺輪詢發(fā)送給同步登陸的應(yīng)用的回調(diào)文件 回調(diào)文件接收到用戶ID之后 生成cookie或者session然后進(jìn)入登陸模式。
您可能感興趣的文章:
- UCenter Home二次開發(fā)指南
- php將會員數(shù)據(jù)導(dǎo)入到ucenter的代碼
- UCenter中的一個可逆加密函數(shù)authcode函數(shù)代碼
- UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE noteexists
- php中通過curl模擬登陸discuz論壇的實(shí)現(xiàn)代碼
- 比較discuz和ecshop的截取字符串函數(shù)php版
- java(jsp)整合discuz同步登錄功能詳解
- 簡單分析ucenter 會員同步登錄通信原理
- PHP實(shí)現(xiàn)合并discuz用戶
相關(guān)文章
PHP使用Redis實(shí)現(xiàn)Session共享的實(shí)現(xiàn)示例
這篇文章主要介紹了PHP使用Redis實(shí)現(xiàn)Session共享的實(shí)現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05php通過PHPExcel導(dǎo)入Excel表格到MySQL數(shù)據(jù)庫的簡單實(shí)例
下面小編就為大家?guī)硪黄猵hp通過PHPExcel導(dǎo)入Excel表格到MySQL數(shù)據(jù)庫的簡單實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10php使用flock阻塞寫入文件和非阻塞寫入文件的實(shí)例講解
下面小編就為大家?guī)硪黄猵hp使用flock阻塞寫入文件和非阻塞寫入文件的實(shí)例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Laravel程序架構(gòu)設(shè)計(jì)思路之使用動作類
這篇文章主要給大家介紹了關(guān)于Laravel程序架構(gòu)設(shè)計(jì)思路之使用動作類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06PHP制作3D扇形統(tǒng)計(jì)圖以及對圖片進(jìn)行縮放操作實(shí)例
這篇文章主要介紹了PHP制作3D扇形統(tǒng)計(jì)圖以及對圖片進(jìn)行縮放操作實(shí)例,需要的朋友可以參考下2014-10-10