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

Lun*_*una 2 database postgresql node.js express typescript

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

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

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

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

  2. 在数据库上创建一个触发器,以在插入新行时删除所有过期的行。

  3. 与 3 相同,但触发器位于应用程序中。

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

jos*_*736 5

删除过期数据等维护任务通常优先级较低,其设计应尽量简单。对于这种任务,具体发生的时间并不重要,因此我只需设置一个每天一次的 cron 作业来删除过期的数据(例如DELETE FROM resets WHERE expiration < NOW())。

\n

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

\n

安排单个作业或触发器会带来不必要的复杂性和/或性能影响。

\n
    \n
  • 通过在行过期时不小心删除行,您可以避免频繁查询和删除过期行带来的性能损失。
  • \n
  • 由于应用程序在重置密码之前会验证令牌及其过期日期,因此清理任务与应用程序的安全性几乎无关:如果 cron 作业由于某种原因无法运行,则实际上并不重要 \xe2\x80\ x94应用程序拒绝使用过期的令牌,并且下次运行清理任务时将删除过期的数据。
  • \n
  • 清理任务变得幂等,因此可以安全地临时手动运行或多次运行。
  • \n
\n