在 Java 中实现忘记密码功能

我目前正在Java项目中实现忘记密码的功能。我的方法是,

  1. 用户单击忘记密码链接。
  2. 在忘记密码页面中,系统提示用户输入他/她已注册到系统的电子邮件地址。
  3. 包含重置密码链接的电子邮件将发送到上述步骤中的给定电子邮件地址。
  4. 用户单击链接,他/她将被重定向到一个页面(重置密码),用户可以在其中输入他的新密码。
  5. 在“重置密码”页面中,“电子邮件地址”字段将自动填充,并且无法更改。
  6. 然后用户输入他的新密码,并且与数据库中的电子邮件地址相关的字段将更新。

尽管我已经限制了重置密码页面中的字段进行编辑(只读字段),但任何人都可以更改浏览器地址栏中的URL并更改电子邮件地址字段。email address

如何限制每个用户在重置密码页面中更改电子邮件地址?


答案 1

在使用令牌发送电子邮件之前,您必须将其保存在数据库中:

  1. 当用户单击“向我发送带有重置说明的电子邮件”时,您将在数据库中创建一条包含以下字段的记录:, ,emailtokenexpirationdate
  2. 用户收到带有 yourwwebsite.com/token 的电子邮件,然后单击它
  3. 使用Url中的,服务器可以,检查请求是否由于过期日期而未过期,将正确的电子邮件放入框中,并要求密码续订。用户键入新密码,您必须将令牌(在表单中)+密码提供给服务器。服务器不关心电子邮件的文本框,因为tokenidentify the userhidden fieldwith the token, user is identified strongly
  4. 然后服务器检查令牌是否仍然有效(再次),检查是否一切正常,保存新密码!服务器可以再次发送消息,以便通知用户密码已因请求而更改。expirationdatepassword match

这真的很安全。请使用较短的时间来改进安全性(例如,5分钟对我来说是正确的)并使用强令牌(作为GUID,请参阅注释)expirationdate


答案 2

我同意@clement给出的答案,如果您必须自己实现忘记密码功能。听起来像是实现此实现的合理和安全的方式。

但是,作为替代方案,如果您不必自己实现它,我建议使用为您执行此操作的服务,例如Stormpath

如果您决定使用 Stormpath,则触发该功能的代码在 Java 中将如下所示(使用 Stormpath 的 Java SDK):

Account account = application.sendPasswordResetEmail("john.smith@example.com");

您的用户将收到一封电子邮件,其中包含如下链接:

http://yoursite.com/path/to/reset/page?sptoken=$TOKEN

然后,当用户单击链接时,您将验证并重置密码,如下所示:

Account account = application.resetPassword("$TOKEN", "newPassword");

有关其工作原理的详细信息,请参阅 Stormpath 的密码重置文档

使用此方法,如果可以选择不这样做,则不必自己实现和维护功能。

注意:Stormpath 已加入 Okta


推荐