實作 OIDC 登出與會話管理:完整指南
深入探索 OIDC 認證與會話管理。學習如何實作 OIDC RP 發起、IdP 發起及後端通道登出,以確保會話處理的安全性。
什麼是 OIDC 會話管理
OpenID Connect (OIDC) 是建立在 OAuth 2.0 協議之上的簡單身份層。它允許客戶端根據授權伺服器執行的認證來驗證終端使用者的身份,並以可互操作和類似 REST 的方式獲取有關終端使用者的基本個人資料信息。
OIDC 的設計旨在易於使用和實作,並關注於簡單性與靈活性。目前廣泛用於單一登入 (SSO) 和 Web 應用程式、行動應用程式以及 API 中的身份驗證。
理解 OIDC 中的認證狀態和會話管理至為關鍵。本文將解釋 OIDC 會話和使用者的認證狀態如何在身份提供者 (IdP)和信賴方 (RP) 或服務提供者 (SP)之間的互動上下文中進行管理。
本文包含幾個關鍵術語。
- 身份提供者 (IdP):存儲和認證使用者身份的服務。
- 服務提供者 (SP) 或信賴方 (RP):為使用者提供服務並依賴於 IdP 進行用戶認證的 Web 應用或服務。
- 登入會話或認證會話:當使用者登入 IdP 時建立的會話。
- 授權:由 IdP 生成和管理的集中化用戶認證與授權信息。
- 單一登入 (SSO):允許使用者使用一組登入憑證(如名稱和密碼)訪問多個應用程式的會話和用戶身份驗證服務。
OIDC 認證流程如何運作
為了更好地理解 OIDC 會話和用戶認證狀態管理,我們簡單回顧一下 Web 應用程式的 OIDC 認證流程:
- 使用者訪問 Web 應用程式 (RP)。
- RP 重導使用者至 OIDC 提供者 (IdP) 進行認證。
- OIDC 提供者檢查使用者的登入會話狀態。如果沒有會話或會話已過期,會提示使用者登入。
- 使用者與登入頁面互動以通過身份驗證。
- 登入頁面將互動結果提交給 OIDC 提供者。
- OIDC 提供者為使用者建立新的登入會話和認證授權。
- OIDC 提供者將使用者重導回 RP 並附帶認證代碼(授權碼流程)。
- RP 接收認證代碼並交換以獲取訪問使用者信息的令牌。
什麼是 RP 登入會話管理
當使用者登入 IdP 時會建立一個登入會話。這個會話用來跟蹤使用者在 IdP 的認證狀態。會話通常包括使用者身份、認證時間和會話過期時間的信息。會話在使用者首次登入時建立並持續到使用者登出或會話過期。
一個會話 Cookie 將安全地設置在使用者的瀏覽器中以保持會話狀態。會話 Cookie 用來識別使用者的會話並為隨後的認證請求進行用戶驗證。這個 Cookie 通常設置了 HttpOnly
和 Secure
標誌以防止客戶端訪問並確保安全通信。
單獨 RP 的單次會話
對於使用者從不同設備或瀏覽器訪問的每個 RP,將會建立一個單獨的用戶登入會話。這意味著使用者的認證狀態在每個 RP 上是獨立維護的。如果使用者從一個 RP 登出,該使用者在其他 RP 上仍將被視為已認證,直到會話過期或使用者從所有 RP 登出。
多個 RP 的集中會話
這種集中會話管理還允許 IdP 在多個 RP 之間保持一致的認證狀態,只要用戶的會話是活躍的且認證請求來自相同的用戶代理(設備/瀏覽器)。這種機制實現了 SSO 功能,使得用戶可以無需再次登錄即可訪問多個 RP。
客戶端的認證狀態
在 OIDC 中,客戶端應用程式 (RP) 依靠 IdP 簽發的令牌來驗證用戶的身份及其認證或授權狀態。客戶端的“登入會話”由 IdP 簽發的令牌維護。
- ID 令牌:包含用戶信息的短期令牌,用來驗證已認證用戶的身份。
- 訪問令牌:允許以用戶名義訪問受保護資源的令牌。訪問令牌的壽命可以是短期或長期的,具體取決於配置。客戶端應用可能依賴於訪問令牌的有效性來確定用戶的認證狀態。如果訪問令牌過期或被清除,使用者可能被認為是“登出”或“未認證”的,需要重新進行身份驗證。
- 刷新令牌:如果請求並授予
offline_access
範疇,客戶端應用可能獲得刷新令牌。它提供了一種在不需要使用者重新進行身份驗證的情況下延長使用者認證狀態的方法。客戶端應用可以使用刷新令牌在当前訪問令牌過期時獲取新的訪問令牌。只要刷新令牌有效,使用者的認證狀態就可以在不需要用戶交互的情况下維持。
這些令牌的組合使得客戶端應用得以維持用戶的認證狀態並以用戶名義訪問受保護的資源。客戶端應用需要安全存儲這些令牌並管理它們的生命周期。例如,對於 SPA 應用程式,令牌可以存儲在瀏覽器的本地存儲或會話存儲中。對於 Web 應用程式,令牌可以存儲在服務器端會話數據或 Cookie 中。
OIDC 的登出機制
由於集中式 IdP 管理的登入會話和分布式客戶端令牌都涉及其中,OIDC 中的登出過程是一個多層面概念。
清除客戶端令牌和本地會話
在客戶端撤銷用戶的認證狀態相對簡單。客戶端應用可以將存儲在用戶瀏覽器或內存中的令牌(ID 令牌、訪問令牌和刷新令牌)移除。此操作能有效地使用戶在客戶端的身份認證狀態無效。
對於管理自身用戶登入會話的 Web 應用,可能需要進一步的步驟,如清除會話 Cookie 和任何會話數據(例如身份提供者或 IdP 簽發的令牌),以確保用戶完全登出。
清除 IdP 集中式會話
IdP 為每位用戶維護一個集中式登入會話。只要此會話是有效的,即使已清除客戶端令牌,使用者仍可能被自動重新認證,使得新的令牌可在不需進一步與 IdP 互動的情況下簽發給客戶端應用。
為了完全從 IdP 登出用戶,客戶端應用 (RP) 可以向 IdP 發出登出請求。應用 (RP) 應將用戶重導至 IdP 的結束會話端點以終止登入會話並清除會話 Cookie。這確保了在所有共用同一集中式會話的應用 (RP) 中進行完整的登出。什麼時候 IdP 收到任何連結的 RP 發出的令牌請求,若共用相同會話,IdP 將提示用戶重新進行身份驗證。
OIDC 後端通道登出
在某些情況下,當使用者從一個應用 (RP) 登出,他們可能希望自動從所有其他應用 (RP) 中登出而不需要額外的用戶交互。這可以使用後端通道登出機制來實現。
當 IdP 從 RP 接收到登出請求時,它不僅會清除登入會,還會向所有共用相同會話並註冊了後端通道登出端點的 RP 發送一個後端通道登出通知。
當 RP 收到後端通道登出通知時,他們可以執行必要的動作來清除用戶的會話和令牌,確保用戶從所有應用中完全登出。