简体中文
  • 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% 时自动续期。了解更多

尽管你仍然可以在管理控制台的应用程序详细信息页面上禁用刷新令牌轮换,但强烈建议保留此保护措施。

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

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

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

处理令牌的最佳实践

  • 使用 HTTPS:始终使用 HTTPS 来保护客户端与授权服务器之间的通信。这可以防止未经授权的第三方拦截和窃取令牌。
  • 设置适当的令牌到期时间:访问令牌应该具有短期的生命周期,以最小化暴露的风险。刷新令牌可以有较长的有效期。
  • 启用刷新令牌轮换:实施刷新令牌轮换以降低刷新令牌泄露的风险。
  • 使用精细化的访问控制:使用精细化的范围来限制访问令牌的权限。只请求客户端应用所需的权限。除非绝对必要,否则不要使用 "all" 或 "admin" 范围来跳过大多数权限检查。

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

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

  • 访问令牌提供访问受保护资源的授权。
  • 刷新令牌消除用户干预以获得新的访问令牌。
  • ID 令牌在客户端提供缓存的用户信息,提高性能。

理解这些令牌的角色和意义对于开发者在其应用程序中实现 OIDC 身份验证至关重要。