简体中文
  • token
  • oidc
  • refresh token
  • access token
  • ID token

了解 OpenID Connect (OIDC) 协议中的访问令牌、刷新令牌和 ID 令牌

OpenID Connect (OIDC) 协议已成为身份管理的广泛采用标准。但你真的理解这些令牌的角色和属性吗?

Charles
Charles
Developer

OIDC、OAuth 2.0 和令牌

OpenID Connect 协议,也称为 OIDC,是一个提供身份管理基本框架的广泛采用的标准。它是在著名的 OAuth 2.0 协议 之上构建的身份验证层。虽然 OAuth 2.0 仅用于资源授权,而 OIDC 是通过引入新 ID 令牌来标准化和增强客户端身份验证的协议。

等等……你可能在 OAuth 时代听说过访问令牌和刷新令牌,现在在 OIDC 中引入了新的概念?你真的理解这些令牌之间的区别吗?

什么是 OIDC 中的访问令牌、刷新令牌和 ID 令牌?

让我们从一个实际场景开始。

假设你正在开发一个典型的客户端-服务器应用程序,它们通过 RESTful API 进行通信。你希望将大部分 API 保持为私人,仅允许授权客户端访问。这需要一种机制来验证客户端并授权对服务器的 API 请求。

理想情况下,RESTful API 应该是无状态的,这意味着服务器不应存储任何客户端会话信息。每当有效请求到达时,服务器只需响应请求的数据。这就是令牌的作用。那么,在这种情况下应使用哪种令牌呢?

访问令牌用于保护 API

在 OAuth 2.0 和 OIDC 中,每个受保护的 API 被视为资源。访问令牌是客户端在请求 API 资源时传输给服务器的令牌,通常通过请求头并采用 JWT 格式。

在服务器端,每当请求到来时,服务器只需验证传入请求是否带有有效的访问令牌。验证过程通常包括解码 JWT 令牌、验证签名和过期时间,以及范围声明以确保客户端有必要的权限。

然而,你可能会想:如果我的客户端应用可以在成功登录后拥有一个有效的访问令牌,并使用访问令牌请求服务器 API,这不是已经足够了吗?为什么还需要其他令牌?

确实,这个问题很好,让我们逐步解释。

为什么需要刷新令牌?

虽然技术上访问令牌确实满足了系统正常工作的最低要求,但由于安全方面的考虑,访问令牌的有效期通常非常短(通常为一个小时)。所以,想象一下,如果我们只有访问令牌,最终用户在每次访问令牌过期时都需要重新验证。对于现代单页 Web 应用(SPA)和尤其是移动应用,频繁注销是一个比较痛苦的用户体验,即使我们的目的是保护其用户安全。

因此,我们需要在令牌安全性和用户便利性之间取得平衡。刷新令牌就是为此而引入的。

为什么刷新令牌可以有更长的寿命?

访问令牌用于访问 API 资源,所以其短期性质有助于降低被泄露或被盗取的风险。另一方面,由于刷新令牌仅用于交换新的访问令牌,因此它们没有访问令牌那么频繁使用,从而降低了暴露的风险。因此,刷新令牌拥有较长的有效期被认为是可以接受的。

确保刷新令牌安全

由于刷新令牌也是存储在客户端,确保它们不被泄露是一个挑战,特别是对于公开客户端如单页 Web 应用(SPA)和移动应用而言。

在 Logto 中,刷新令牌默认启用了自动旋转机制,这意味着当满足条件时,授权服务器会颁发一个新的刷新令牌:

  • 单页应用:被识别为非发送方约束客户端,这些应用要求刷新令牌旋转。刷新令牌的存活时间(TTL)不能指定。
  • 原生应用和传统 Web 应用:刷新令牌旋转默认启用,当达到其 TTL 的 70% 时自动续约。了解更多关于 Logto 中的刷新令牌旋转

虽然你仍然可以在管理控制台的应用详情页面上选择禁用刷新令牌旋转,但强烈建议保留此保护措施。

什么是 ID 令牌,它为何重要?

ID 令牌是 OIDC 的一个独特功能,提供关于已验证用户的身份信息。

访问令牌用于访问受保护资源,刷新令牌用于获取新的访问令牌,而 ID 令牌通常用于在客户端缓存用户信息,从而减少向授权服务器请求用户数据的需求。在大多数情况下,甚至可以安全地说,拥有 ID 令牌就相当于用户已被验证。

处理令牌的最佳实践

  • 使用 HTTPS:始终使用 HTTPS 来保护客户端和授权服务器之间的通信。这可以防止未经授权的第三方截取和窃取令牌。
  • 设置适当的令牌过期时间:访问令牌应有较短的有效期以将暴露风险降到最低。刷新令牌可以有较长的有效期。
  • 启用刷新令牌旋转:实现刷新令牌旋转以降低刷新令牌泄露的风险。
  • 使用精细的访问控制:使用精细的范围限制访问令牌的权限。仅请求客户端应用所需的权限。避免使用“all”或“admin”范围,除非绝对必要,以绕过大多数权限检查。

回顾:OIDC 中访问令牌、刷新令牌和 ID 令牌的关键区别

在 OIDC 协议中,刷新令牌、访问令牌和 ID 令牌共同作用以提供安全和无缝的用户身份验证。

  • 访问令牌提供访问受保护资源的授权。
  • 刷新令牌消除了用户介入获取新访问令牌的需要。
  • ID 令牌在客户端提供缓存的用户信息,提高性能。

了解这些令牌的角色和重要性对于在应用中实现 OIDC 身份验证的开发者来说至关重要。