实现 OIDC 注销和会话管理:完整指南
深入探索 OIDC 认证和会话管理。了解如何实现 OIDC RP 发起、IdP 发起和后端通道注销以安全处理会话。
深入探索 OIDC 认证和会话管理。了解如何实现 OIDC RP 发起、IdP 发起和后端通道注销以安全处理会话。
OpenID Connect (OIDC) 是一个基于 OAuth 2.0 协议构建的简单身份层。它允许客户端根据授权服务器进行的认证验证终端用户的身份,以及以互操作和类 REST 的方式获取关于终端用户的基本个人资料信息。
OIDC 旨在易于使用和实现,重点在于简单性和灵活性。它广泛应用于网络应用、移动应用和 API 中的单点登录 (SSO) 和身份验证。
理解 OIDC 中的认证状态和会话管理至关重要。本文解释了 OIDC 会话和用户认证状态在身份提供者 (IdP) 和依赖方 (RP) 或服务提供者 (SP) 之间的交互环境下是如何管理的。
本文包括几个关键术语。
为了更好地理解 OIDC 会话和用户认证状态管理,我们简要回顾下针对于网络应用的 OIDC 认证流程:
用户登录到 IdP 时建立登录会话。此会话用于跟踪用户在 IdP 的认证状态。会话通常包括用户身份、认证时间和会话过期时间等信息。会话在用户首次登录时创建,保留至用户注销或会话过期。
为了维护会话状态,会在用户浏览器中安全地设置一个会话 cookie。会话 cookie 用于识别用户的会话,并在后续的认证请求中对用户进行认证。这个 cookie 通常使用 HttpOnly 和 Secure 标记设置,以防止客户端访问并确保安全的通信。
对于用户从不同设备或浏览器访问的每个 RP,将分别建立一个用户登录会话。这意味着用户的认证状态对每个 RP 是独立维护的。如果用户从一个 RP 注销,其他 RP 上的用户仍将被认证,直到会话过期或用户从所有 RP 注销为止。
这种中心化的会话管理还允许 IdP 在用户会话活跃且认证请求来自同一个用户代理设备/浏览器的情况下,保持多个 RP 之间的一致认证状态。此机制启用了 SSO 功能,用户能在无需再次登录的情况下访问多个 RP。
在 OIDC 中,客户端应用程序 (RP) 依靠 IdP 发放的令牌来验证用户的身份和认证或授权状态。客户端的“登录会话”由 IdP 颁发的令牌维护。
offline_access 范围时,客户端应用程序可能会收到刷新令牌。它提供了一种在不需要用户重新认证的情况下扩展用户认证状态的方式。客户端应用程序可以在当前访问令牌过期时使用刷新令牌获取新访问令牌。只要刷新令牌有效,就可以保持用户的认证状态而无需用户交互。这些令牌的组合允许客户端应用程序维护用户的认证状态,并代表用户访问受保护资源。客户端应用程序需要安全地存储这些令牌并管理它们的生命周期。(例如,对于 SPA 应用程序,可以将令牌存储在浏览器的本地存储或会话存储中。对于网络应用程序,可以在服务器端会话数据或 cookie 中存储令牌。)
OIDC 中的注销过程由于涉及中心化 IdP 管理的登录会话和分布于客户端的令牌而成为一个多方面的概念。
在客户端注销或撤销用户认证状态相对简单。客户端应用程序可以从用户的浏览器或内存中移除存储的令牌(ID 令牌、访问令牌和刷新令牌)。此操作有效地使用户在客户端的认证状态无效。
对于管理自己用户登录会话的网络应用程序,可能需要额外的步骤。这些步骤包括清除会话 cookie 和任何会话数据(例如由身份提供者或 IdP 发放的令牌)以确保用户完全注销。
IdP 为每个用户维护一个中心化的登录会话。只要这个会话是活跃的,即使客户端令牌被清除,用户也可能被自动重新认证,允许无进一步与 IdP 交互而向客户端应用程序颁发新令牌。
为了完全注销一个用户来自 IdP,客户端应用程序(RP)可以发起一个注销请求到 IdP。应用程序(RP)应将用户重定向到 IdP 的结束会话端点以终止登录会话并清除会话 cookie。这确保了共享相同中心化会话的所有应用程序(RPs)之间的完全注销。一旦登录会话被终止,当 IdP 接收到来自共享相同会话任一已链接 RP 的令牌请求时,IdP 将提示用户进行重新认证。
在某些情境下,当用户从一个应用程序(RP)注销时,他们可能希望在无需任何额外用户交互的情况下自动从所有其他应用程序(RP)中注销。这可以通过使用 后端通道注销 机制完成。
当 IdP 从某个 RP 收到注销请求时,它不仅会清除登录会话,还会向所有使用相同会话并注册了后端注销端点的 RP 发送一个后端通道注销通知。
当 RPs 接收到后端注销通知时,它们可以执行必要的操作以清除用户的会话和令牌,确保用户已完全从所有应用程序中注销。