我想知道在更改密码/注销时不击db而使JWT无效的最佳实践。
我下面的想法是通过点击用户数据库来处理上述2种情况。
1.万一密码更改,我检查存储在用户数据库中的密码(散列)。
2.在注销的情况下,我将上次注销时间保存在用户数据库中,因此通过比较令牌创建时间和注销时间,我可以使这种情况无效。
但是这两种情况都是以用户每次点击api时每次点击用户db为代价的。任何最佳做法都值得赞赏。
更新: 我不认为我们能够在不影响db的情况下使JWT失效。所以我想出了一个解决方案。我已经发布了我的答案,如果您有任何疑问,欢迎您。
使用无刷新令牌时:
1.更改密码时: 用户更改密码时,请在用户数据库中记下更改密码时间,因此,如果更改密码时间大于令牌创建时间,则令牌无效。因此,剩余的会话将很快注销。
2.当用户注销时: 当用户注销时,将令牌保存在单独的DB中(例如:InvalidTokenDB,并在令牌过期时从Db中删除令牌)。因此,用户从相应的设备注销,他在其他设备中的会话不受干扰。
因此,在使JWT无效的同时,我遵循以下步骤:
与上述方法有关 :
使用刷新令牌时: 访问令牌的有效期为1天,刷新令牌作为生存期
1.更改密码时: 当用户更改密码时,请更改用户的刷新令牌。因此,剩余的会话将很快注销。
2.当用户注销时 :用户注销时,将令牌保存在单独的DB中(例如:InvalidTokenDB,并在令牌过期时从Db中删除令牌)。因此,用户从相应的设备注销,他在其他设备中的会话不受干扰。
注意 :尽管Hanz在基于令牌的身份验证中使用刷新令牌中建议了一种保护刷新令牌的方法是否安全?,我听不懂他在说什么。任何帮助表示赞赏。
因此,如果有人有很好的建议,欢迎您提出意见。
更新: 我添加了答案,以防您的应用程序不需要刷新令牌且使用寿命满的情况。 Sudhanshu 给出了这个答案。感谢Sudhanshu。所以我认为这是最好的方法,
当不需要刷新令牌并且访问令牌没有到期时:
用户登录时,请在其用户数据库中创建一个没有到期时间的登录令牌。
因此,在使JWT无效的同时,请执行以下步骤,
因此,使用这种方法,您无需在数据库过期之前将注销令牌存储在数据库中,也无需在更改密码的情况下存储令牌创建时间(在上述情况下需要)。但是,我相信这种方法仅在您的应用程序具有不需要刷新令牌且令牌没有到期的要求时才有效。
如果有人对这种方法感到担心,请告诉我。欢迎您发表评论:)