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

跨主域單點登入 (SSO) 實作思路:子域代理跳轉法

     編輯:PHP 綜合知識

問題定義

Cookie 受同源策略限制,無法跨主域 (如 a.com、b.com) 共享。Session 依賴 Cookie 傳遞 ID,故無法直接跨主域共享 Session。需設計機制在使用者登入後,將認證狀態同步至各主域。

提出方案:子域代理跳轉同步法

架構假設

  • 主域:a.com (身分認證中心)、b.com、c.com (業務應用)
  • 各業務主域建立子域指向認證中心 IP:passport.b.com、passport.c.com → A 伺服器

流程步驟

  1. 使用者在 a.com/login 完成驗證,建立 Session,取得 session_id
  2. 認證中心輸出導向鏈結頁面,依序導向:
    passport.b.com/sync.php?sid=xxx&i=0 → passport.c.com/sync.php?sid=xxx&i=1 → ...
  3. 各 sync.php 執行:
    session_id($_GET['sid']); session_start(); $_SESSION['synced'] = true; header('Location: ' . $next_url);
  4. 瀏覽器在各主域下建立相同 session_id 的 Cookie
  5. 最終導回業務首頁,各域 Session 已同步

關鍵代碼 (passport.b.com/sync.php)

優點與缺點分析

現代標準替代方案 (強烈推薦)

OAuth 2.0 / OpenID Connect (OIDC)

  • 業界標準:Keycloak、Auth0、Okta、自建 IdentityServer
  • 授權碼模式 + PKCE,安全性高
  • Access Token (JWT) 無狀態驗證,Refresh Token 更新
  • 支援 SSO、社交登入、MFA、裝置授權

SAML 2.0

  • 企業級聯邦身分識別,XML 基礎
  • IdP (Identity Provider) + SP (Service Provider)
  • 適合企業內部系統整合

共享 Session 儲存體 (Redis) + 同域 Cookie

  • 所有主域部署於同一父域下 (如 app1.example.com, app2.example.com)
  • Cookie 設定 domain=.example.com,共享 Session ID
  • Session 資料集中存 Redis,各節點無狀態

結語

子域跳轉法可作為舊系統快速整合過渡方案,新系統建議直接採用 OIDC/OAuth 2.0 標準協定,安全、擴展、生態完善。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
優點缺點/風險
不需共享儲存體、資料庫跳轉鏈路長,使用者可見網址變化
實作簡單、相容舊系統任一跳轉失敗導致該域不同步
無第三方依賴前端可見 session_id (URL 參數),需 HTTPS + 短效
同步後各域獨立運作登出需反向同步清除所有域 Cookie