登出
在 Logto(作为基于 OIDC 的身份提供商)中,登出过程是一个多方面的概念,因为它涉及到由 Logto 管理的集中式登录会话和由客户端应用程序管理的分布式认证 (Authentication) 状态。
登录会话
为了更好地理解登出过程,首先需要了解 Logto 中用户登录会话及其认证 (Authentication) 状态是如何管理的。
- 用户访问 Web 应用程序(RP)。
- 客户端应用程序将用户重定向到 Logto(IdP)进行认证 (Authentication)。
- OIDC 提供商检查用户的登录会话状态。如果没有会话或会话已过期,用户将被提示登录。
- 用户与登录页面交互以进行认证 (Authentication)。
- 登录成功后,Logto 为用户创建一个新会话,并重定向回客户端应用程序并附带授权 (Authorization) 码。
- OIDC 提供商为用户创建一个新的登录会话和认证 (Authentication) 授权。
- OIDC 提供商将用户重定向回客户端并附带认证 (Authentication) 代码(授权 (Authorization) 码流程)。
- 客户端接收认证 (Authentication) 代码并用其交换令牌以访问用户信息。
- 向客户端应用程序授予令牌。
组件
由 Logto 管理的集中式登录会话
在上述流程中,集中式登录会话由 Logto 管理。用户成功登录时会创建会话,用户登出时会销毁会话。用户的会话过期时也会销毁会话。
Logto 登录会话使用会话 Cookie 管理。用户登录时会设置会话 Cookie。所有的认证 (Authentication) 请求都会根据会话 Cookie 进行验证。如果会话 Cookie 存在且有效,用户将自动认证 (Authentication) 并直接重定向到客户端应用程序并附带授权 (Authorization) 码。否则,用户将被提示登录。
-
共享的 Logto 会话 Cookie 对于从同一用户代理(例如浏览器)登录多个客户端应用程序的用户,用户将在 Logto 域下拥有一个共享的会话 Cookie。这意味着用户只需登录一次即可自动认证 (Authentication) 其他客户端应用程序。
-
独立的 Logto 会话 Cookie 对于从不同设备或浏览器登录不同客户端应用程序的用户,用户将在 Logto 域下拥有独立的会话 Cookie。这意味着用户需要分别为每个客户端应用程序登录。
由客户端应用程序管理的分布式 认证 (Authentication) 状态
每个客户端应用程序维护其自己的认证 (Authentication) 状态。无论是原生应用、SPA 还是 Web 应用程序,都有其自己的方式来管理用户的认证 (Authentication) 状态。
登录成功后,客户端应用程序可能会收到一个 ID 令牌 和一个 访问令牌。客户端应用程序可以使用 ID 令牌来确定用户的身份,并使用访问令牌来访问用户的资源。用户的认证 (Authentication) 状态由访问令牌的过期时间表示。
- 原生和 SPA 应用程序: 客户端应用程序需要安全地存储和管理这些令牌以维护用户的认证 (Authentication) 状态。例如,将令牌存储在本地存储或会话存储中,并在用户登出时清除令牌。
- Web 应用程序: 像使用 Next.js 等框架构建的 Web 应用程序通常会在管理用户登录会话的同时管理 Logto 发放的令牌。一旦用户登录,Web 应用程序从 Logto 接收到令牌后,可以像 SPA 应用程序一样在客户端存储令牌,或者在服务器端存储令牌并使用 Cookie 或其他机制管理会话。
登出机制
清除客户端的令牌和本地会话
在客户端,简单的登出涉及清除本地会话并从本地存储或会话存储中移除令牌(ID 令牌、访问令牌、刷新令牌)。这会导致仅在客户端的登出,而集中式会话仍然保持不变。以这种方式登出的用户可能仍然能够访问同一授权 (Authorization) 服务器会话下的其他应用程序,直到集中式会话过期或被主动销毁。