實施 OIDC 登出和會話管理:完整指南
深入探索 OIDC 認證和會話管理。學習如何實現由 RP 發起、IdP 發起和後台通道的 OIDC 登出,以安全地處理會話。
深入探索 OIDC 認證和會話管理。學習如何實現由 RP 發起、IdP 發起和後台通道的 OIDC 登出,以安全地處理會話。
OpenID Connect (OIDC) 是基於 OAuth 2.0 協議構建的一個簡單身份層。它允許客戶端基於授權伺服器執行的認證來驗證終端用戶的身份,並以互操作和類似 REST 的方式獲取有關終端用戶的基本配置文件信息。
OIDC 的設計重點是簡單易用和靈活實施,廣泛用於 Web 應用程序、手機應用程序和 API 的單一登入 (SSO) 和身份驗證。
了解 OIDC 中的認證狀態和會話管理至關重要。本文解釋了在身份提供者 (IdP) 和依賴方 (RP) 或服務提供者 (SP) 之間的交互中如何管理 OIDC 會話和用戶認證狀態。
本文包含一些關鍵術語。
為了更好地理解 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 應用,令牌可以存儲在服務器端的會話數據或 cookies 中。)
由於涉及到集中式 IdP 管理的登入會話和分散的客戶端令牌,OIDC 的登出過程是多方面的概念。
在客戶端登出或撤銷用戶的認證狀態相對簡單。客戶端應用程序可以移除存儲在瀏覽器或內存中的令牌(ID 令牌、存取令牌、刷新令牌)。這一操作有效地使用戶在客戶端的認證狀態失效。
對於管理自己用戶登入會話的 Web 應用,可能需要額外的步驟。這包括清除會話 cookie 和任何會話數據(例如,身份提供者或 IdP 發行的令牌)以確保用戶完全登出。
IdP 保持每個用戶的集中登入會話。只要會話還是活躍的, 即使客戶端令牌已清除,用戶可能仍會被自動重新認證,允許新令牌發放給客戶端應用,而不需要與 IdP 進一步交互。
若要將用戶完全登出 IdP,客戶端應用程序 (RP) 可以向 IdP 發起登出請求。應用程序 (RP) 應將用戶重定向到 IdP 的 end-session endpoint 來終止登入會話並清除會話 cookies。這確保在共享相同集中式會話的所有應用程序 (RPs) 中的完全登出。一旦登入會話終止,不論何時 IdP 接收到來自任何共享相同會話的 RPs 的令牌請求,將提示用戶重新認證。
在某些情況下,當用戶從一個應用程序 (RP) 登出時,可能希望自動地從所有其他應用程序 (RPs) 登出,而不需要額外的用戶交互。這可以使用後台通道登出機制來實現。
當 IdP 從一個 RP 收到登出請求時,它不僅會清除登錄會話,還會向使用相同會話並有註冊後台通道登出端點的所有 RPs 发送一个后端登出通知。
当 RPs 接收到后台通道登出通知时,可以执行必要的操作来清除用户的会话和令牌,确保用户完全从所有应用程序中登出。