1.介紹
ucenter的同步登陸,可以整個多個應用的會員系統,實現同步登陸 同步註銷等等
版本: UCenter_1.6.0_SC_UTF8 (下載的時候認準 discuz.net)
PHP版本: 5.6
2.接入過程
1 首先解壓ucenter軟件包,然後可以看到裏面有幾個文件夾 分別是 advanced readme upload utilities
2. 然後upload這個文件夾就是Ucenter的服務器端 ,建好數據庫,安裝好就行,我這邊改名爲ucserver
3.現在我們來實驗一下
4 還是剛剛的文件夾 裏面有一個demo ,在advanced裏的examples
5 我們把它複製到 服務器的根目錄 命名爲examples1 ,用http://localhost/examples 訪問 。目錄結果如下 (ucclient就是examples1,網上來的圖,哈哈)
config.inc.php文件和uc_client文件夾(這個在上一級目錄),放到自己站點的一個目錄下
uc_client文件夾,是一個很重要的類庫,當然其實他不只是類庫,但是他最重要的作用就是給我們提供相應的同步方法,這些同步方法,都是用來通知ucenter server的(也可以認爲就是調用ucenter的方法)。
config.inc.php這個配置文件,配置了我們需要的參數的,比如ucenter server的url等等,都是寫很重要的參數,在uc.php和uc_client中都會用到。
include沒有什麼用,這裏只是爲了讓他不報錯,加入的。你可以改造uc.php後,將include目錄去除。
6 現在我們登陸到ucenter的後臺 添加應用
添加
如果是自己做的網站請選其他 ,應用ip一般爲空,通訊密鑰說一下,它和你的網站根目錄的 config.inc.php的這段對應
define('UC_KEY', '1234567890'); // 與 UCenter 的通信密鑰, 要與 UCenter 保持一致
還有 UC_APPID 也要做好對應,添加後會有一個ID號
define('UC_APPID', 2);
添加提交後,如果提示通訊成功說明成功了。
如果通訊失敗,看看網站目錄結構是否不正確,然後把ip也加上去
還有uc的連接參數也要正確填寫
define('UC_DBHOST', 'localhost'); // UCenter 數據庫主機
define('UC_DBUSER', 'root'); // UCenter 數據庫用戶名
define('UC_DBPW', ''); // UCenter 數據庫密碼
define('UC_DBNAME', 'uc'); // UCenter 數據庫名稱
define('UC_DBCHARSET', 'utf8'); // UCenter 數據庫字符集
define('UC_DBTABLEPRE', 'uc.uc_'); // UCenter 數據庫表前綴
3. 實驗一下
3.1 弄好後,我們在 http://localhost/examples/ucexample_1.php註冊一個xiaoming ,然後到ucenter後臺的用戶管理看看是否註冊成功
3.2 我們把上面的examples1 再複製一份出來,命名爲examples2 吧。注意配置好應用,並通訊成功。這樣就能模擬多一個站點出來
3.3 好了,做好上面的準備工作後。我們用xiaoming登陸一下 (http://localhost/examples2/ucexample_1.php?example=login)
3.4 我們再回去看看 http://localhost/examples1是否也同步登陸了。
如果不行,有可能是cookie衝突了。 把 examples2下的uc.php裏的synlogin方法裏 的cookie的名字改一下
我這裏改爲Example_auth2了 ,因爲examples1的是Example_auth
3.5 上面的只是單純cookie登陸,沒有連接數據庫,需要的可以看看demo裏的code文件夾的 login_db.php
3.6 同樣的,同步註冊點擊demo裏的註冊就好了
4.代碼分析
爲什麼可以同步呢
我們來看看demo裏登陸過程
list($uid, $username, $password, $email) = uc_user_login($_POST['username'], $_POST['password']);
setcookie('Example_auth', '', -86400);
if(!$db->result_first("SELECT count(*) FROM {$tablepre}members WHERE uid='$uid'")) {
//判斷用戶是否存在於用戶表,不存在則跳轉到激活頁面
$auth = rawurlencode(uc_authcode("$username\t".time(), 'ENCODE'));
echo '您需要需要激活該帳號,才能進入本應用程序<br><a href="'.$_SERVER['PHP_SELF'].'?example=register&action=activation&auth='.$auth.'">繼續</a>';
exit;
}
//用戶登陸成功,設置 Cookie,加密直接用 uc_authcode 函數,用戶使用自己的函數
setcookie('Example_auth', uc_authcode($uid."\t".$username, 'ENCODE'));
//生成同步登錄的代碼
$ucsynlogin = uc_user_synlogin($uid);
echo '登錄成功'.$ucsynlogin.'<br><a href="'.$_SERVER['PHP_SELF'].'">繼續</a>';
exit;
1. 首先 1 -8 行就是判斷賬號的正確性了
2. 然後生成cookie
3. 重點來了最後調用這個方法 uc_user_synlogin 同步其他應用,意思是我這邊已經登錄了,你也設置cookie登陸吧
4. 調用這個方法後 ucenter就會 通知到其他應用,如 examples2應用下的 api下的uc.php下的 synlogin 方法
5 .那我們再來看看 這個 synlogin 方法
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('Example_auth2', _authcode($uid."\t".$username, 'ENCODE'));
}
可以看出這個方法接受到uid和username這些參數後,生成了cookie
就獲得了 登陸狀態。
當然了不同的cms和網站,cookie的名字和生成cookie的值的方式是不一樣的
這個需要根據具體需求二次開發
6. 除了同步登陸 還有同步註冊,同步登出等等,具體看demo了
5. 關於cookie的跨域設置問題
由於ucenter的同步登陸主要是用cookie來實現,這裏就涉及到一個跨域問題。
所以在二次開發的時候注意不要刪掉這個,這個是拿來解決跨域問題的。
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
6.參考鏈接
原理:
https://www.iteye.com/blog/xuebingnanmm-627840