首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

UCenter 通信原理深度解析:同步登入流程詳解

     編輯:PHP 相關知識

UCenter 通信原理深度解析:同步登入流程詳解

UCenter 是 Discuz! 系列產品的核心用戶中心,實現多應用之間的同步登入、同步登出等功能。其核心機制基於 Cookie 傳遞與 JavaScript 回調通知。以下梳理完整通信流程:

核心流程六步走

  1. 用戶登入驗證:用戶在 Discuz 輸入帳號密碼,經 logging.php 中的 uc_user_login() 驗證。
  2. 觸發同步登入 API:驗證通過後,調用 uc_client/client.php 的 uc_user_synlogin(),構造請求發送至 UCenter 的 index.php。
  3. UCenter 接收分發:UCenter index.php 解析 model=user、action=synlogin,調用 control/user.php 的 onsynlogin() 方法。
  4. 遍歷應用列表發送 JS 通知:onsynlogin() 遍歷已啟用同步登入的應用,生成 <script src="APP_URL/api/uc.php?time=...&code=..."></script> 標籤,輸出至頁面。
  5. 應用端接收解密設 Cookie:各應用的 api/uc.php 接收 GET 參數,用 _authcode() 以 UC_KEY 解密,獲取 UID 等信息,調用 _setcookie() 寫入 Cookie。
  6. 實現自動登入:用戶訪問其他應用時,瀏覽器攜帶已設 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,實現單點登入體驗。理解此流程有助於二次開發、故障排查及異構系統整合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved