如何从数据库中清除过期的令牌?

Posted

技术标签:

【中文标题】如何从数据库中清除过期的令牌?【英文标题】:How to clean expired tokens from database? 【发布时间】:2020-10-27 05:25:27 【问题描述】:

我正在构建密码恢复功能。当用户请求我的应用程序创建一个包含用户 ID、哈希和到期日期的新行。

然后用户会收到一封电子邮件,其 URL 包含数据库上的哈希值。当 URL 哈希和 DB 哈希匹配时,他可以更改密码。

删除过期的密码恢复行的最佳方法是什么? 我想到了 3 种可能性,但似乎都不对。

    当请求密码恢复时,会安排一个作业在该行过期时从数据库中删除该行。 (这意味着使用 Redis/Bull 来处理工作)

    在数据库上创建触发器以在插入新行时删除所有过期行。

    与 3 相同,但触发器在应用程序中。

我担心只保留数据库中的行而不清理它会污染无用的数据。

【问题讨论】:

这是非常固执的,所以不确定是否会有“最佳”选项 - 这取决于您使用的框架以及您想在这方面花费多少精力 - 我个人认为所有这些 3没关系。尽管根据您的描述提出了一个小建议 - 除了发送哈希之外,您可能还希望发送过期时间以及哈希和过期时间的 HMAC 摘要,以便您可以在去 db 进行验证之前对其进行验证。只需增加一点安全性即可避免黑客用假哈希敲击您的数据库,因为这必须是一个匿名 api。 【参考方案1】:

删除过期数据等维护任务通常是低优先级的,它们的设计应该倾向于简单化。对于这种任务,它何时发生并不重要,所以我只需设置一个每天一次的 cron 作业来删除过期数据(例如DELETE FROM resets WHERE expiration < NOW())。

至关重要的是,应用程序的密码重置代码必须将存储在数据库中的到期日期与当前时间进行比较,而不仅仅是依赖于是否存在匹配的重置令牌。

调度单个作业或触发器会引入不必要的复杂性和/或性能影响。

通过在行过期时不小心删除行,您可以避免频繁查询和删除过期行的性能损失。 因为应用程序会在重置密码之前验证令牌及其到期日期,所以清理任务与应用程序的安全性几乎无关:如果 cron 作业由于某种原因无法运行,这并不重要 — app拒绝使用过期token,下次清理任务运行时会删除过期数据。 清理任务变为幂等的,因此可以安全地手动运行 ad-hoc 或多次运行。

【讨论】:

以上是关于如何从数据库中清除过期的令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何从刷新令牌中获取访问令牌?刷新令牌会过期吗?

从 jsonwebtoken 中提取过期日期时间

如何在jwt中过期时刷新令牌

Instagram 访问令牌过期

如何识别和删除服务器上过期的 FCM 令牌?

springcache清除过期缓存