忘记密码链接:如何验证链接? [复制]

Posted

技术标签:

【中文标题】忘记密码链接:如何验证链接? [复制]【英文标题】:Forgot Password Link: How to validate link? [duplicate] 【发布时间】:2012-09-21 11:54:55 【问题描述】:

可能重复:Forgot Password: what is the best method of implementing a forgot password function?

我正在为 Web 应用程序实现忘记密码。用户将收到一封邮件,其中包含指向该网页的链接以输入新密码。我想将链接的有效期限制为自创建以来最多 24 小时。我应该如何实现这个?我应该如何生成此参数,以使相同的链接不被重复使用或无法修改链接并重复使用?

不确定这是否有用,但我使用的是 Spring 3.1 框架。

【问题讨论】:

【参考方案1】:

对于此类功能,您需要创建一个基于时间戳的随机令牌并将其与忘记密码链接一起发送。您需要按照以下提到的步骤进行操作

    当用户点击忘记密码时创建一个随机令牌,并将其保存在数据库中并使用到期时间。 将嵌入了令牌的链接通过电子邮件发送给用户。 当用户点击链接时,首先检查令牌过期时间,如果过期可以向用户显示消息。 如果令牌未过期,则允许用户更改密码并可以将令牌状态设置为无效。

为了更安全,您可以创建更多步骤以确保链接来自有效用户并且未被黑客入侵。

【讨论】:

【参考方案2】:

常见的方法是在您的 url 中包含生成的 id。该 id 将与提交的日期一起保存在 db 中,无论是创建日期还是过期时间。这样您就可以创建一个后台任务来清除您过期的 id。

【讨论】:

【参考方案3】:

我会做的是:

重置用户密码(随机值),有效期为现在 + 24 小时 向用户发送新密码,其中包含指向“更改密码”页面的链接

优点:

Spring Security 会处理过期问题 如果我“窃取”了指向“更改密码”页面的链接,那将一文不值:用户需要输入当前密码和新密码(两次)

【讨论】:

【参考方案4】:

    一旦用户请求新密码,生成一些随机令牌,例如使用RandomStringUtils.randomAlphanumeric(int)。将此令牌存储在与请求密码重置的用户 ID 关联的数据库中。还存储创建时的时间戳。

    通过电子邮件向用户发送链接。此链接应包含您刚刚创建的令牌作为 URL 的一部分。

    一旦用户进入这个链接,她就会被要求输入新密码。如果您担心链接可能会泄露,还请询问一些个人详细信息(电子邮件、名字等)

    在服务器端你:

      查找令牌以及与该令牌关联的用户 ID

      通过比较当前日期确保令牌仍然有效

      存储新密码散列

【讨论】:

以上是关于忘记密码链接:如何验证链接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

KeyCloak 忘记密码 电子邮件链接

在codeigniter中忘记密码

忘记了来自 aws cognito 的密码链接

django 开发忘记密码通过邮箱找回功能

Codeigniter - 忘记密码

仅在单击“忘记密码”链接时如何使用 PATCH 方法