Discuz! 作為國內最流行的論壇系統,雖內建通行證機制,但在實際專案中常面臨「雙用戶表」困擾:既增加註冊管理成本,又浪費資料庫資源。本文分享如何繞過通行證,直接在自有系統中實現與 Discuz! 的同步登入,核心在於複用 Discuz! 的 Cookie 生成與驗證邏輯。
若你的系統架構允許,直接 include 'discuz_root/include/common.inc.php'; 即可。引用後,$discuz_uid 與 $discuz_user 變數即代表當前登入會員的 UID 與用戶名,後續業務邏輯可直接判斷這兩個變數。
若不想引入整個 Discuz! 環境,只需從 global.func.php 複製三個關鍵函數到自有函式庫:
dsetcookie() — Discuz! 專用 Cookie 寫入函數authcode() — 可逆加密/解密函數clearcookies() — 清除 Cookie 函數(可選)function login($array) {
$username = $array['username'];
$password = $array['password'];
// 1. 驗證帳密
$sql = "SELECT `uid`, `password`, `secques` FROM `cdb_members`
WHERE `username` = '$username' AND `password` = md5('$password')";
try {
$rs = $this->_db->query($sql);
} catch (Exception $e) {
exit("查詢出錯:" . $e->getMessage());
return 0;
}
$row = $this->_db->fetch($rs);
if ($row) {
// 2. 登入成功,寫入 auth Cookie
dsetcookie('sid', '', -2423234234); // 註銷舊 sid
$secques = $row['secques'];
$uid = $row['uid'];
$formPassword = $row['password'];
// 關鍵:加密鍵 '123' 必須與 Discuz! 設定完全一致
dsetcookie('auth', authcode("$formPassword\t$secques\t$uid", 'ENCODE', '123'), 0);
return 1; // 成功
} else {
return 2; // 帳密錯誤
}
}
authcode 定義authcode 函數內容authcode 時傳入的第三個參數(加密鍵,範例中的 '123')任一處不一致,Cookie 解密失敗,導致論壇端無法識別登入狀態。
config.inc.php 中的 $cookie_domain、$cookie_path)cdb_ 是否正確md5(password),新版可能為 md5(md5(password).salt),需對應調整 SQL掌握核心加密邏輯後,同步登入、單點登出、第三方 OAuth 綁定等進階功能皆可舉一反三。