当前位置: 首页 > 面试题库 >

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

景嘉实
2023-03-14
问题内容

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

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

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

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

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

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


问题答案:

使用无刷新令牌时:

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. 用户更改密码时,请从用户数据库中删除所有令牌,然后要求他再次登录

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

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



 类似资料:
  • 我通过在自定义登录API中生成JWT(JSON Web Token)在Azure移动服务中使用自定义身份验证。一旦用户拥有JWT,它将一直有效,直到达到其编码的过期时间。 除了在每个经过身份验证的请求上根据会话表显式检查JWT令牌之外,是否有办法在JWT令牌到期之前使其失效(当用户注销时会发生这种情况),以便任何后续使用该令牌作为头中的值发出的请求都不会到达任何表API或自定义API脚本?

  • 问题内容: 我有几个使用Web服务的服务,并且缓存了很多结果。通过缓存,我的意思是存储在服务的变量中。用户注销时,应清除数据。这些服务如下所示(简化版本): } 这是打字稿,但可以解决如下问题: 我可以使用在回答清除数据这个问题 这是做这样的事情: 但是,当我们有多个服务和控制器时,这是很多代码。我们都知道,这个新人将向服务中添加一些新数据,而他却忘记了将其添加到注销序列中。这简直是​​一个坏习惯

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 问题内容: 我有一个普通的Node.js脚本,该脚本通过API从Wikipedia中提取数据并将其存储在SQLite数据库中。我正在使用此node- sqlite3 模块。 在某些情况下,我要提取多达60万篇文章中的数据,并在数据库中连续存储有关每篇文章的一些元数据。从API中以500为一组检索文章。 检索带有500条文章中的数据的JSON对象的请求将对象传递给此回调: 这些模块默认情况下并行运行

  • 我正在寻找一个简单、安全的解决方案,使用Node存储用户密码。我是一个密码学新手,但是一直在试图通过网上搜索拼凑出一个解决方案。我正在寻找一种验证,即我所提出的是一个具有基本(而不是银行、医院等)安全需求的web应用程序的可靠解决方案。这是: …以下是我做出的选择让我走到了这一步: 使用什么哈希算法? 根据这篇被广泛引用的文章,看起来领先的竞争者是PBKDF2、bCrypt和scrypt。我选择P

  • 嗨,我正在开发一个与Express API通信的React应用程序。我试图实现JWT认证,但我不知道当jwt到期时会发生什么。如果用户在令牌过期时被注销,这似乎不是很用户友好。 我应该使用刷新令牌吗?正如node-jsonwebTokens包留档中所说。这可能不是最好的方法。 我应该在对服务器的每个请求中创建一个新的jwt吗?如果用户长时间阅读一篇文章而不做任何请求,他将被注销。 也许我错了,最好