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

15

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

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

那么有人能告诉我如何避免这种情况吗?


可能是如何撤销JWT令牌?的重复问题。 - Sinandro
授权令牌不应该有任何过期时间:从安全角度来看,这是一个错误的假设。 - Billal Begueradj
3个回答

16

这对我来说似乎是一个熟悉的问题,我已经回答了类似的问题 最佳实践: 如何使 JWT 无效 .

因此,解决您的问题的步骤如下:

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

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

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

因此,基本上您需要在用户数据库中存储令牌,并在使其无效时使用它。 简单 :)


我喜欢这个解决方案。但是我注意到你在另一个帖子中的原始答案要复杂得多。为什么你建议在另一个答案中存储无效的令牌,而不是只存储用户DB条目中的活动令牌(就像你在这里做的那样)? - Florian Walther

13

JWT 的 exp 声明是可选的。如果一个令牌没有它,那么就认为它不会过期。

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

var token = jwt.sign({email:'sivamanismca@gmail.com',role:'User'}, "Secret", {});


1
据我所知,您无法使JWT令牌失效,我建议始终将过期时间设置短,并设置最长持续时间为一周。对于您的应用程序,定期检查令牌是否有效并在无效时请求新令牌可能会很麻烦,但有些JWT库允许您刷新令牌或检查令牌是否有效。如果您坚持要保留没有过期时间的令牌,则建议保留某种黑名单,供中间件检查。之前也有类似的问题here。希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接