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