我想知道在更改密码/注销时在不点击db的情况下使JWT失效的最佳实践.

我有下面的 idea ,通过点击用户数据库来处理以上两种情况.

1.如果密码发生更改,我会判断存储在用户数据库中的密码(哈希).

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

但这两种情况的代价是,用户每次点击api时都会点击用户db.任何最佳实践都将不胜感激.

UPDATE:

推荐答案

When No Refresh token is used:

1.While changing password:当用户更改密码时,请在用户数据库中记录更改密码时间,因此当更改密码时间大于令牌创建时间时,令牌无效.因此,剩余的会话将很快注销.

2.When User logs out:当用户注销时,将令牌保存在单独的数据库中(例如:InvalidTokenDB,并在令牌过期时从数据库中删除令牌).因此,用户从相应的设备注销,他在其他设备中的会话保持不变.

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

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

Concern with the above method:

  1. 对于每个api请求,我都需要遵循上面的所有步骤,这可能会影响性能.

When Refresh token is used:,访问令牌到期日为1天,刷新令牌为终身有效期

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

2. When User logs out:当用户注销时,将令牌保存在单独的数据库中(例如:InvalidTokenDB,并在令牌过期时从数据库中删除令牌).因此,用户从相应的设备注销,他在其他设备中的会话保持不变.

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

  1. 判断令牌是否有效
  2. 如果有效,请判断InvalidTokenDB中是否存在该令牌.
  3. 如果不存在,请使用userDB中的刷新令牌判断刷新令牌.
  4. 如果等于,那么这是一个有效的标记

Concern with the above method:

  1. 对于每个api请求,我都需要遵循上面的所有步骤,这可能会影响性能.
  2. 我如何使刷新令牌失效,因为刷新令牌没有有效性,如果它被黑客使用,身份验证仍然有效,请求将始终成功.

Note:虽然汉兹提出了一种在Using Refesh Token in Token-based Authentication is secured?中保护刷新令牌的方法,但我无法理解他在说什么.感谢您的帮助.

因此,如果有人有好的建议,欢迎发表 comments .

UPDATE:

When No Refresh token needed and no expiry of access tokens:

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

因此,在使JWT失效时,请遵循以下步骤:,

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

因此,使用这种方法,您不需要在注销令牌到期之前将其存储在数据库中,也不需要在更改密码时存储令牌创建时间,而在上述情况下需要更改密码.然而,我相信这种方法只有在你的应用程序有不需要刷新令牌和令牌不过期的要求时才有效.

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

Node.js相关问答推荐

MongoDB-如何验证Document字段以仅允许特定的文件扩展名?

如何在MEVN堆栈中结合创建和更新表单流程?

无法使用 Express 设置会话 cookie 的过期日期

使用 NPM 8 安装本地构建

如何在 Firestore 函数上使用类型模型来获取字段值

在 .htaccess 中从非 www 切换到 www 后如何解决无法访问该站点?

等待不在 Express.js 中处理 res.app.render

Axios 响应循环通过函数只返回第一个映射对象的结果

错误:无法检测到网络(event="noNetwork",code=NETWORK_ERROR,version=providers/5.6.8)

'{ id: string; 类型的参数}' 不可分配给FindOneOptions类型的参数

如何让我的 Next.js 应用在运行 ubuntu-latest 的 Azure 应用服务中启动?

Web3.js 脚本在监听 CreatedPairs 时退出

Node.js 表达的 Error 对象expose 了哪些属性?

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

如何在 MongoDB 上只收听 localhost

如何在 node 中转义 shell 命令的字符串?

Node.js -Firebase 服务帐户私钥不会解析

使用 node 的内置调试器判断变量?

如何从 Node.js 应用程序Ping?

在 Node.js 中获取终端的宽度