UCenter 是 Discuz! 系列產品的核心用戶中心,實現多應用之間的同步登入、同步登出等功能。其核心機制基於 Cookie 傳遞與 JavaScript 回調通知。以下梳理完整通信流程:
logging.php 中的 uc_user_login() 驗證。uc_client/client.php 的 uc_user_synlogin(),構造請求發送至 UCenter 的 index.php。index.php 解析 model=user、action=synlogin,調用 control/user.php 的 onsynlogin() 方法。onsynlogin() 遍歷已啟用同步登入的應用,生成 <script src="APP_URL/api/uc.php?time=...&code=..."></script> 標籤,輸出至頁面。api/uc.php 接收 GET 參數,用 _authcode() 以 UC_KEY 解密,獲取 UID 等信息,調用 _setcookie() 寫入 Cookie。client.php:UCenter 客戶端函數庫,封裝網絡通信與加密。uc.php:應用端回調入口,負責解密數據並執行具體登入邏輯。config.php:配置 UC_KEY、UCenter API 地址等核心參數。<?php
include './config.inc.php';
include './uc_client/client.php';
$username = 'kyee';
$password = '123456';
list($uid, $username, $password, $email) = uc_user_login($username, $password);
if ($uid > 0) {
setcookie("username", $username, time() + 24*3600);
echo uc_user_synlogin($uid); // 輸出一堆 <script> 標籤
echo '登入成功';
} elseif ($uid == -1) {
echo '用戶不存在或被刪除';
} elseif ($uid == -2) {
echo '密碼錯誤';
} else {
echo '未定義錯誤';
}
?>
輸出的 JavaScript 代碼會自動請求各應用的 uc.php 完成同步。開發者可自定義 uc.php 邏輯,不拘泥於官方格式。
UCenter 同步登入本質是「中心化下發 Cookie」:一處登入,UCenter 通知所有從應用種植同域或跨域 Cookie,實現單點登入體驗。理解此流程有助於二次開發、故障排查及異構系統整合。