NestJS & Passport:更改用户密码时更改 JWT 令牌?

Posted

技术标签:

【中文标题】NestJS & Passport:更改用户密码时更改 JWT 令牌?【英文标题】:NestJS & Passport: Change JWT token on user password change? 【发布时间】:2021-12-29 20:00:24 【问题描述】:

我正在尝试为使用 PassportJS 在 NestJS API 上更改密码的用户重置/更改令牌 (JWT)。这是此授权如何工作的一个简洁示例:https://docs.nestjs.com/security/authentication。

我想在密码更改时生成一个新令牌,以确保在用户登录的每台设备上,密码更改后他们将获得未经授权并因此退出。

这是我在用户服务中处理密码更改的方式:

async changePassword(uId: string, password: any) 
    return await this.userRepository.createQueryBuilder()
      .update(User)
      .set( password: await bcrypt.hash(password.value, 10) )
      .where("userId = :userId",  userId: uId )
      .execute();
  

我认为没有预构建方法可以做到这一点。 JwtService只有5个方法:decodesign(这个是用来生成token的)、signAsyncverifyverifyAsync

那么我该如何正确地做到这一点呢?

【问题讨论】:

【参考方案1】:

您需要某种方式来使已提供给用户的 JWT 无效。由于您不能只对令牌执行此操作(它是无状态的,它拥有自己的有效性),因此您需要在数据库中创建一个 JWT 限制列表,以检查传入的 JWT。如果 JWT 在限制列表中,则拒绝请求。否则,让它通过(如果它当然有效)

【讨论】:

可以这样做,但仍需要为该用户生成全新的令牌。当我尝试这样做时,它可能没有改变或产生相同的结果。 您是如何尝试生成新令牌的?它应该因为新的过期时间而改变 嗯...我尝试重用签名方法,因为我找不到任何其他方法可以在同一用户过期之前为其重新生成令牌...知道怎么做吗?跨度> 但他们没有签署同一个令牌。它们实际上是不同的令牌,因为它们的到期时间不同。我实际上只是在不同时间签署了两个令牌以表明创建了不同的令牌 这就是想要使 JWT 无效的问题。一旦你发出它,如果你一开始没有保存它,除非用户发送它,否则你将无法取回它。因此,您需要保存为该用户创建的每个 JWT,然后在密码更改时使所有这些 JWT 失效。就像我说的,您正在重新创建会话身份验证方法,但使用 JWT 作为令牌

以上是关于NestJS & Passport:更改用户密码时更改 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

NestJs Passport jwt 未知策略

NestJS jwt-passport 身份验证

NestJs + Passport - JWTStrategy 永远不会被 RS256 令牌调用

Nest.js 中使用 @nestjs/passport 的可选身份验证

NestJS:使用 graphql 的 Passport LinkedIn 策略

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?