一尘不染

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

node.js

我想知道在更改密码/注销时不击db而使JWT无效的最佳实践。

我下面的想法是通过点击用户数据库来处理上述2种情况。

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

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

但是这两种情况都是以用户每次点击api时每次点击用户db为代价的。任何最佳做法都值得赞赏。

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


阅读 390

收藏
2020-07-07

共1个答案

一尘不染

使用无刷新令牌时:

1.更改密码时: 用户更改密码时,请在用户数据库中记下更改密码时间,因此,如果更改密码时间大于令牌创建时间,则令牌无效。因此,剩余的会话将很快注销。

2.当用户注销时:
当用户注销时,将令牌保存在单独的DB中(例如:InvalidTokenDB,并在令牌过期时从Db中删除令牌)。因此,用户从相应的设备注销,他在其他设备中的会话不受干扰。

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

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

与上述方法有关

  1. 对于每个api请求,我需要执行上述所有步骤,这可能会影响性能。

使用刷新令牌时: 访问令牌的有效期为1天,刷新令牌作为生存期

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

2.当用户注销时
:用户注销时,将令牌保存在单独的DB中(例如:InvalidTokenDB,并在令牌过期时从Db中删除令牌)。因此,用户从相应的设备注销,他在其他设备中的会话不受干扰。

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

  1. 检查令牌是否有效
  2. 如果有效,请检查令牌是否存在于InvalidTokenDB中。
  3. 如果不存在,请使用userDB中的刷新令牌检查刷新令牌。
  4. 如果等于,则其为有效令牌

与上述方法有关

  1. 对于每个api请求,我需要执行上述所有步骤,这可能会影响性能。
  2. 我如何使刷新令牌无效,因为刷新令牌无效,如果黑客使用它,但认证仍然有效,请求将始终是成功的。

注意 :尽管Hanz在基于令牌的身份验证中使用刷新令牌中建议了一种保护刷新令牌的方法是否安全?,我听不懂他在说什么。任何帮助表示赞赏。

因此,如果有人有很好的建议,欢迎您提出意见。

更新: 我添加了答案,以防您的应用程序不需要刷新令牌且使用寿命满的情况。 Sudhanshu
给出了这个答案。感谢Sudhanshu。所以我认为这是最好的方法,

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

用户登录时,请在其用户数据库中创建一个没有到期时间的登录令牌。

因此,在使JWT无效的同时,请执行以下步骤,

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

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

如果有人对这种方法感到担心,请告诉我。欢迎您发表评论:)

2020-07-07