在 node.js 中更改密码和注销时使 JWT 无效的最佳实践?

Best practices to invalidate JWT while changing passwords and logout in node.js?(在 node.js 中更改密码和注销时使 JWT 无效的最佳实践?)
本文介绍了在 node.js 中更改密码和注销时使 JWT 无效的最佳实践?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我想知道在更改密码/注销时使 JWT 无效而不敲击 db 的最佳做法.

I would like to know the best practices to invalidate JWT without hitting db while changing password/logout.

我有以下想法通过访问用户数据库来处理上述两种情况.

I have the idea below to handle above 2 cases by hitting the user database.

1.如果密码更改,我检查存储在用户数据库中的密码(散列).

1.Incase of password changes, I check for password(hashed) stored in the user db.

2.在注销的情况下,我将上次注销时间保存在用户数据库中,因此通过比较令牌创建时间和注销时间,我可以使这种情况无效.

2.Incase of logout, I save last-logout time in user db, hence by comparing the token created time and logout time, I can able to invalidate this case.

但这两种情况的代价是每次用户点击 api 时都会点击用户 db.任何最佳做法都会受到赞赏.

But these 2 cases comes at the cost of hitting user db everytime when the user hits the api. Any best practise is appreciated.

更新:我认为我们不能在不点击 db 的情况下使 JWT 无效.所以我想出了一个解决方案.我已经发布了我的答案,如果您有任何疑问,欢迎您.

UPDATE: I dont think we can able to invalidate JWT without hitting db. So I came up with a solution. I have posted my answer, if you have any concern, you are welcome.

推荐答案

不使用刷新令牌时:

1.修改密码时:用户修改密码时,注意用户db中修改密码的时间,所以当修改密码时间大于token创建时间时,则token为无效.因此,剩余的会话将很快被注销.

1.While changing password: when the user changes his password, note the change password time in the user db, so when the change password time is greater than the token creation time, then token is not valid. Hence the remaining session will get logged out soon.

2.当用户注销时: 当用户注销时,将令牌保存在单独的数据库中(例如:InvalidTokenDB 并在令牌过期时从数据库中删除令牌).因此,用户从各自的设备上注销,他在其他设备上的会话不受干扰.

2.When User logs out: When the user logs out, save the token in a seperate DB (say: InvalidTokenDB and remove the token from Db when token expires). Hence user logs out from the respective device, his sessions in other device left undisturbed.

因此,在使 JWT 无效时,我遵循以下步骤:

Hence while invalidating a JWT, I follow the below steps:

  1. 检查令牌是否有效.
  2. 如果有效,请检查它是否存在于 invalidTokenDB(已注销的令牌存储到其到期时间的数据库)中.
  3. 如果不存在,则检查用户 db 中的令牌创建时间和更改密码时间.
  4. 如果更改密码时间
  5. 令牌创建时间,则令牌有效.

关注上述方法:

  1. 对于每个 api 请求,我都需要按照上述所有步骤操作,这可能会影响性能.

使用刷新令牌时:访问令牌有效期为1天,刷新令牌为终身有效

When Refresh token is used: with expiry of access token as 1 day, refresh token as lifetime validity

1.修改密码时: 当用户修改密码时,修改用户的刷新令牌.因此,剩余的会话将很快被注销.

1. While changing password: When the user changes his password, change the refresh token of the user. Hence the remaining session will get logged out soon.

<强>2.当用户注销时:当用户注销时,将令牌保存在单独的数据库中(例如:InvalidTokenDB 并在令牌过期时从数据库中删除令牌).因此,用户从各自的设备上注销,他在其他设备上的会话不受干扰.

2. When User logs out: When the user logs out, save the token in a seperate DB (say: InvalidTokenDB and remove the token from Db when token expires). Hence user logs out from the respective device, his sessions in other device left undisturbed.

因此,在使 JWT 无效时,我遵循以下步骤:

Hence while invalidating a JWT, I follow the below steps:

  1. 检查令牌是否有效
  2. 如果有效,检查令牌是否存在于 InvalidTokenDB 中.
  3. 如果不存在,请使用 userDB 中的刷新令牌检查刷新令牌.
  4. 如果等于,那么它是一个有效的令牌

关注上述方法:

  1. 对于每个 api 请求,我都需要按照上述所有步骤操作,这可能会影响性能.
  2. 如何使刷新令牌无效,因为刷新令牌没有有效性,如果被黑客使用,仍然认证有效,请求将始终成功.

注意:尽管 Hanz 在 Using Refesh Token in Token-based Authentication is secure? ,我听不懂他在说什么.任何帮助表示赞赏.

Note: Although Hanz suggested a way to secure refresh token in Using Refesh Token in Token-based Authentication is secured? , I couldn't able to understand what he is saying. Any help is appreciated.

所以如果有人有好的建议,欢迎您的意见.

So If anyone have nice suggestion, your comments are welcome.

更新:我正在添加答案,以防您的应用程序不需要具有生命周期到期的刷新令牌.此答案由 Sudhanshu (https://stackoverflow.com/users/4062630/sudhanshu-高尔).谢谢苏丹舒.所以我相信这是最好的方法,

UPDATE: I am adding the answer incase your app needs no refresh token with lifetime expiry. This answer was given by Sudhanshu (https://stackoverflow.com/users/4062630/sudhanshu-gaur). Thanks Sudhanshu. So I believe this is the best way to do this,

当不需要刷新令牌且访问令牌没有过期时:

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

when user login, create a login token in his user database with no expiry time.

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

Hence while invalidating a JWT, follow the below steps,

  1. 检索用户信息并检查令牌是否在他的用户数据库中.如果允许.
  2. 当用户注销时,仅从他的用户数据库中删除此令牌.
  3. 当用户更改密码时,从他的用户数据库中删除所有令牌并要求他再次登录.

因此,使用这种方法,您不需要在数据库中存储注销令牌直到它们过期,也不需要在更改上述情况下需要的密码时存储令牌创建时间.但是,我相信这种方法仅在您的应用具有不需要刷新令牌且令牌没有到期的要求时才有效.

So with this approach, you don't need to store neither logout tokens in database until their expiry nor storing token creation time while changing password which was needed in the above cases. However I believe this approach only valids if your app has requirements with no refresh token needed and no expiry of the tokens.

如果有人对这种方法有疑虑,请告诉我.欢迎您的意见:)

If anyone has concern with this approach, please let me know. Your comments are welcome :)

这篇关于在 node.js 中更改密码和注销时使 JWT 无效的最佳实践?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转
Rails/Javascript: How to inject rails variables into (very) simple javascript(Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript)
CoffeeScript always returns in anonymous function(CoffeeScript 总是以匿名函数返回)
Ordinals in words javascript(javascript中的序数)
getFullYear returns year before on first day of year(getFullYear 在一年的第一天返回前一年)