Discuz! 預設同步登入需 UCenter 啟用通訊,若需繞過激活直接同步登入 (適用 X3,理論相容 2.5),可修改 api/uc.php 中的 synlogin 函式。核心邏輯:若本地會員不存在,即時從 UCenter 抓取資料建立會員並寫入相關資料表,最後發放 Cookie。
source/api/uc.php (或 api/uc.php 視版本而定)。synlogin 函式 (約 180 行),定位 if(($member = getuserbyuid($uid, 1))) { 區塊。if (($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
if (($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
} else {
// 載入 UCenter 客戶端函式
if (!function_exists('uc_get_user')) {
loaducenter();
}
// 從 UCenter 取得會員資料
$user = uc_get_user($uid, 1);
if ($user) {
$time = time();
// 1. common_member 基本資料
DB::query("REPLACE INTO ".DB::table('common_member')." SET
`uid`='{$user[0]}',
`username`='{$user[1]}',
`password`='".md5(random(10))."',
`email`='{$user[2]}',
`adminid`='0',
`groupid`='10',
`regdate`='{$time}',
`emailstatus`='0',
`credits`='0',
`timeoffset`='9999'");
// 2. common_member_status 狀態資料
DB::query("REPLACE INTO ".DB::table('common_member_status')." SET
`uid`='{$user[0]}',
`regip`='{$_G['clientip']}',
`lastip`='{$_G['clientip']}',
`lastvisit`='{$time}',
`lastactivity`='',
`lastpost`='0',
`lastsendmail`='0'");
// 3. common_member_count 積分擴充
DB::query("REPLACE INTO ".DB::table('common_member_count')." SET
`uid`='{$user[0]}',
`extcredits1`='0', `extcredits2`='0', `extcredits3`='0',
`extcredits4`='0', `extcredits5`='0', `extcredits6`='0',
`extcredits7`='0', `extcredits8`='0'");
// 4. 相關 profile / forum / home 空表
DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'");
DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'");
DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'");
// 5. 統計表註冊人數 +1
DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime`='".date('Ymd', $time)."'");
// 6. 重新讀取會員並發放 Cookie
if (($member = getuserbyuid($uid, 1))) {
dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}
}
}
md5(random(10)),實際驗證走 UCenter,本地密碼僅佔位。uc_get_user 是否正確回傳陣列;確認 DB::table 前綴設定正確;查看 Apache/Nginx 錯誤日誌是否有 SQL 執行失敗。uc_user_edit 通知或排程同步。