authentication - 仅将生命周期最长的 JWT 的时间存储到数据库中,而不是整个 JWT
问题描述
有很多关于撤销 JWT 的文章,并且之前已经在这里提出了很多问题。这是当前的情况以及我如何解决它:
用户可以多次登录,以便他们生成任意数量的令牌。登录后,每个令牌都会存储到数据库中。每当用户点击受保护的端点时,所提供的令牌都会得到签名和生命周期的验证。如果一切正确,则数据库检查令牌是否存在于数据库中。这是因为如果用户注销,令牌仍然可能有效。因此,在注销后,每个用户令牌都会从数据库中删除。使用 cron 作业过期的数据库令牌会自动删除。数据库表看起来像
令牌 | 所有者 | expires_at
我正在考虑简化这个过程:
既然您知道您将在注销后从用户那里删除所有令牌,我认为您唯一需要检查的是该用户是否存在任何令牌。
用户数据库表可以有一个session_expires_at列,其中包含从发出的最后一个令牌开始的最大过期时间。该过程将是
登录时
每当生成一个新令牌时,如果该过期时间大于session_expires_at的值,则获取其过期时间并更新数据库列
命中受保护的端点时
从session_expires_at中选择值。如果该值为 null 或小于“now”,则验证失败。
退出时
只需将此用户的session_expires_at设置为 null
仍然可以添加诸如“启用每个设备的单独身份验证”之类的功能。我专注于我想到的最重要的部分......
优点:
- 不需要令牌表,只需要用户表中的一个新列
- 无需存储每个有效令牌,只需更新一个用户的会话列
缺点:
- 报告非常有限。您只能读取当前登录的用户和未登录的用户。
我认为这可能会简化非企业项目的身份验证过程。你怎么看待这件事?我是不是忘记了什么?
解决方案
推荐阅读
- visual-studio - Blazor WebAssembly Visual Studio 调试器问题
- r - 通过小标题列表运行 t.test
- javascript - 尝试通过 React Native 将视频上传到 S3 时遇到问题
- powershell - Powershell 获取 InvokeMethodOnNull 消息
- file-upload - Apache Commons FTPSClient 上传无法完成
- webpack - 如何在 Laravel Mix 中使用“node-sass-asset-functions”自定义函数?
- android - Recyclerview 没有正确更新数据
- arrays - 删除数组内对象的特定属性的重复 - Angular
- google-analytics - AdSense 和谷歌分析之间的巨大点击差异
- javascript - 我如何记住一个按钮是否已经被点击,并且即使在使用 js 和 html 重新加载页面之后也能记住?