【问题标题】:Refreshing a JWT Access Token using JWT Refresh Tokens and NestJS使用 JWT 刷新令牌和 NestJS 刷新 JWT 访问令牌
【发布时间】:2022-01-25 19:45:23
【问题描述】:

我正在使用访问令牌和刷新令牌设置身份验证。我基本上在那里,但我无法理解如何刷新访问令牌。从我从这里和其他资源中看到的情况来看,大多数人似乎设置路由处理程序来刷新令牌,如下所示:

@UseGuards(JwtRefreshGuard)
@Get('/refresh')
refresh(@GetUser() user: User) {
  return this.authService.getAccessToken(user.username);

我正在使用使用护照策略的自定义守卫来验证刷新令牌:

async validate(request: Request, payload: JwtPayload) {
  const { username } = payload;
  const refreshToken = request.cookies?.Refresh;
  return this.userService.getUserIfRefreshTokenMatches(
    refreshToken,
    username,
  );

我不明白的是如何在不中断应用用户正常操作的情况下实现向该处理程序发出请求,以及如何在访问令牌过期时检查是否需要调用该处理程序。

【问题讨论】:

    标签: jwt nestjs passport.js refresh-token auth-guard


    【解决方案1】:

    如何检查访问令牌过期时是否需要调用此处理程序。

    当您使用 jwt 令牌从客户端调用服务器时,如果它已过期(这是我们使用刷新令牌的情况),使用 jsonwebtoken npm 包,我们可以向客户端发送回调消息“Jwt 已过期“(由于您正在验证 jwt,您可以识别它是否是过期的令牌)。然后,客户端可以向服务器上的 /refresh 端点发送另一个请求,请求新的 jwt 令牌。然后您可以将新的 jwt 令牌从服务器发送到客户端,客户端可以使用新创建的 jwt 向服务器上的受保护路由发送请求。

    【讨论】:

    • 我以为他明白这一点。但是如何实施呢?请分享您在不中断用户操作的情况下实现该刷新令牌处理程序的代码,如果没有,那么您的答案更适合作为评论
    • 不需要额外的实现。当用户登录系统时,您可以使用与创建 jwt 令牌相同的功能。唯一的附加部分是您需要在发出新的访问令牌之前验证刷新令牌。这可以通过用户文档(MongoDB)中的附加字段(例如 token_count)轻松完成。验证后调用用于创建访问令牌并发送新 jwt 的函数。
    • 您已经提到了需要实施的附加部分,这些部分在您的答案中不存在。他问的是如何实施,而不是它是如何工作的。
    【解决方案2】:

    在客户端,您可以控制访问令牌过期。因此,如果访问令牌有 5 分钟的生命,并且在 3 分钟前出生,那么只有访问令牌可以传输到后端。但是如果访问令牌诞生后已经过去了10分钟,那么客户端必须先向后端发送一个刷新令牌,并且只有在收到新的访问令牌后才能继续处理当前请求。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 2021-12-14
      • 2020-10-15
      • 2018-10-16
      • 1970-01-01
      • 2022-12-23
      • 2016-03-05
      • 2016-06-25
      • 2018-09-29
      相关资源
      最近更新 更多