如何以及何时使用刷新令牌?

How and when to use Refresh Tokens?

我正在慢慢掌握使用微服务进行身份验证的窍门,但我遇到了一个相当基本的问题。我假设的架构如下,一个 auth 微服务,处理注册、登录、令牌刷新,还有一个 TODOS 微服务处理用户的待办事项。

我想使用短期 JWT 和刷新令牌。

如何使用刷新令牌?由于 JWT 过期如此之快(几分钟),我是否向 todos 发出请求,同时如果 JWT 过期,我发回一个错误(未授权或 JWT 过期特定错误?)然后我做返回 auth 服务进行刷新,然后以某种方式再次调用 API?我是否在客户端上进行池化并定期检查 JWT 是否已过期?

这些是我的一些问题,但基本上可以归结为

  1. 如何处理 JWT 过期? (在 API 通话期间和空闲时)
  2. 我 return 是 JWT 已过期的特定错误还是只是 403?
  3. 如何处理这些往返(如果这是要走的路),在收到 403,然后授权刷新然后返回调用之间?

因此您的调用者拥有访问令牌和刷新令牌。

当调用者想要调用 api 时,他们将使用访问令牌。接收方将验证访问令牌(包括到期),如果访问令牌不再有效,将回答“访问被拒绝”。

当客户端访问被拒绝时,他们使用刷新令牌来获取新的访问令牌。

问题是为什么需要刷新令牌?正如您所说 - 访问令牌是短暂的。为什么这样?创建访问令牌后,每个 resource/api 都可以验证它。但是没有办法撤销访问令牌(带有撤销列表的选项很难正确实现);因此,我们使用短期访问令牌而不是撤销。

由于访问令牌的生命周期很短,如果他们不断要求批准另一个令牌,客户体验会很差;如果使用访问令牌代表客户做一些事情,这是不可能的。为了解决这个问题,我们有刷新令牌。刷新令牌用于获取新的访问令牌。

最重要的 属性 使用刷新令牌:这是令牌提供者有机会撤销访问权限的时刻 - 提供者可能决定此刷新令牌不再有效,例如因为客户决定停止访问。

你的问题:

  1. 如何处理 JWT 过期? (在 API 通话期间和空闲时)

您使用访问令牌调用 api,如果访问被拒绝,您可以使用刷新令牌获取新的访问令牌。这是最简单的方法。作为替代方案,您可以使用后端作业在访问令牌过期时刷新它们。这显然更复杂。

  1. 我 return 是 JWT 已过期的特定错误还是只是 403?

我不会。如果拒绝访问,则拒绝访问。

  1. 如何处理这些往返(如果这是要走的路),在收到 403,然后授权刷新然后返回调用之间?

不知道你是什么意思。我的代码(在此用例中)有一个简单的句柄——如果访问被拒绝,则使用刷新令牌获取新的访问令牌;然后缓存访问令牌。