如何使没有过期时间的 JWT 令牌失效

问题描述 投票:0回答:4

正在使用 JWT 创建一个 Node.js 后端应用程序。对我来说,要求很简单,授权令牌不应该有任何到期时间。但是当用户更改密码时,我在使 JWT 失效期间遇到问题。

当用户更改密码时,我将创建一个新的 JWT 令牌,并删除旧令牌,但用户仍然可以使用他的旧 JWT 令牌(来自其他登录设备)并可以访问应用程序。

那么谁能告诉我如何避免这种情况?

javascript node.js authentication token jwt
4个回答
18
投票

对我来说这似乎是一个熟悉的问题,我已经回答过类似的问题使 JWT 令牌失效的最佳实践

所以解决你的问题的步骤如下,

当用户登录时,在他的用户数据库中创建一个没有过期时间的登录令牌。

因此,在使 JWT 失效时,请按照以下步骤操作,

  • 检索用户信息并检查令牌是否在他的用户数据库中。如果是的话就允许吧。
  • 当用户注销时,仅从其用户数据库中删除此令牌。
  • 当用户更改密码时,从其用户数据库中删除所有令牌并要求他重新登录。

所以基本上你需要将令牌存储在用户的数据库中并在失效时使用它。简单:)


15
投票

JWT 的 exp 声明是可选的。如果令牌没有它,则认为它没有过期

根据https://www.npmjs.com/package/jsonwebtoken的文档,expiresIn字段也没有默认值,所以忽略它。

var token = jwt.sign({email:'[email protected]',role:'User'}, "Secret", {});


1
投票

据我所知,您无法使您的 JWT 令牌无效,我总是建议始终设置一个较短的过期时间,最长持续时间为一周,首先为您的应用程序实施检查您的令牌是否有效可能会很痛苦有时并在无效时请求新的令牌,有一些规定允许您刷新令牌或检查令牌对于大多数 JWT 库是否有效。现在,如果您坚持要保留令牌而没有过期时间,那么我建议您保留中间件将检查的各种黑名单。之前也有人问过类似的问题这里。希望这有帮助


0
投票

您可以为此使用

iat
声明 (https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.6)。在数据库中存储用户的
minimumIssuedAt
日期,并验证声明中的
iat
是否至少是
minimumIssuedAt
声明所标识的用户的
sub
。当用户更改密码时,您可以将用户的
minimumIssuedAt
日期设置为当前日期,从而使该用户的所有现有令牌失效。

虽然这确实需要维护一些状态,但它比将所有已发布的 JWT 存储在数据库中更简单。

© www.soinside.com 2019 - 2024. All rights reserved.