在Java中实现忘记密码功能
我目前正在一个Java项目中实现忘记密码功能。我的方法是
- 用户单击忘记密码链接李>
- 在忘记密码页面中,系统提示用户输入他/她在系统中注册的电子邮件地址李>
- 在上述步骤中,包含重置密码链接的电子邮件将发送到给定的电子邮件地址李>
- 用户单击链接,他/她将被重定向到一个页面(重置密码),用户可以在该页面输入新密码李>
- 在重置密码页面中,“电子邮件地址”字段将自动填写,并且无法更改李>
- 然后用户输入新密码,数据库中与电子邮件地址相关的字段将更新李>
虽然我已经限制了重置密码页面中的email address
字段的编辑(只读字段),但任何人都可以更改浏览器地址栏中的url并更改电子邮件地址字段
如何限制每个用户在重置密码页面中更改电子邮件地址
# 1 楼答案
如果你必须自己实现忘记密码功能,我同意@clement给出的答案。听起来这是一种合理且安全的实现方式
然而,作为替代方案,如果您不必自己实现它,我建议使用一个为您实现这一点的服务,比如Stormpath
如果您决定使用Stormpath,将触发该功能的代码在Java中看起来像这样(使用Stormpath的Java SDK):
您的用户将收到一封带有以下链接的电子邮件:
然后,当用户单击链接时,您将验证并重置密码,如下所示:
有关其工作原理的详细信息可以在Stormpath的password reset documentation中找到
使用这种方法,如果您可以选择不这样做,就不必为自己实现和维护功能
注意:Stormpath已加入Okta
# 2 楼答案
在使用令牌发送电子邮件之前,您必须将其保存在DB中:
email
,token
,expirationdate
token
,服务器可以identify the user
,检查请求是否由于expirationdate而过期,将正确的电子邮件放入框中,并请求密码续订。用户输入新密码,您必须向服务器提供令牌(hidden field
格式)+密码。服务器不关心电子邮件的文本框,因为with the token, user is identified strongly
expirationdate
(再次)检查令牌是否仍然有效,检查password match
,如果一切正常,保存新密码!服务器可以再次发送消息,通知用户密码已因请求而更改李>这真的很安全。请为
expirationdate
使用较短的时间来提高安全性(例如5分钟对我来说是正确的),并使用强令牌(作为GUID,请参阅注释)# 3 楼答案
您不能限制用户更改电子邮件地址
通过在浏览器中编辑源代码,可以轻松更改电子邮件地址,即使您已将“隐藏”或将文本框设置为只读
您可以为
uniq random string or token
提供重置链接和 在点击重置密码链接后,或在用户提交重置密码请求后,通过检查请求中的电子邮件地址和令牌字符串以及数据库中的电子邮件地址和令牌字符串,检查电子邮件地址和令牌组合如果您的数据库中存在电子邮件地址,则表示电子邮件地址有效,如果不存在,则发送消息说明您的用户记录中不存在电子邮件地址
注意:
如果您使用的是任何框架或简单的servlet,那么最好提供链接,以便在显示重置密码表单之前验证电子邮件和令牌字符串。如果令牌字符串或电子邮件地址无效,则可以限制用户提交重置密码请求,并在提交请求后进行验证。它将比提交重置密码请求后进行验证更安全
# 4 楼答案
有两种常见的解决方案:
第一种解决方案有很多问题,不适合使用。这些 以下是一些原因:
所以,第二种解决方案更适合使用。但是,你应该考虑以下问题:
常见的解决方案是生成一个URL来创建一个唯一的令牌,该令牌可以作为URL参数发送,它包含一个URL,例如 “重置/?id=2ae755640s15cd3si8c8i6s2cib9e14a1ae552b”
# 5 楼答案
这个问题在回答这个问题三年前就发布了。。。但我认为这可能对其他人有所帮助
简而言之:我完全同意你的观点。看起来非常安全,你唯一的开放式终端也很有意义——你如何确保没有人更改用户名,从而为他设置新密码
我不太喜欢暂时存储东西的想法是DB(正如公认的答案所示)
我考虑的想法是在发送给用户的链接中对数据进行签名。然后,当用户点击链接,服务器收到呼叫时,服务器也会得到加密部分,并可以验证数据是否未被触碰
顺便说一句(这里有一个“推广”):我已经为这些用例实现了一个JAVA项目(还有“创建帐户”、“更改密码”等)。它在GitHub上是免费的,开源的。它完美地回答了你的问题。。。在Spring Security的基础上,用Java实现
每件事都有解释(如果遗漏了什么,请告诉我……)
看看:https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows
见a Demo here
还有一个客户端web应用程序使用auth流,其自述文件包含所有解释:https://github.com/OhadR/Authentication-Flows
# 6 楼答案
如果你正在寻找实现忘记密码的完整代码,我在这里分享我的代码。 把链接放到你需要的地方
下面是我的
forgotpassword.jsp
页面一旦提交了电子邮件,它就会被重定向到
mymail_fp.jsp
页面,在那里我将电子邮件发送给用户。 下面是mymail.jsp
页现在我在这里做的是,在向用户发送电子邮件之前,我保存发送时间、过期时间、生成0到1000000的随机数,并与发送时间连接,加密is,并将其作为电子邮件链接中的查询字符串发送。因此,电子邮件将被发送,密码链接将与散列密钥一起发送。现在,当用户点击链接时,他们会被发送来重置密码。jsp,下面是
reset_password.jsp
页在这个页面中,我获取散列键并与数据库散列键进行比较,结果为真,然后获取过期时间并与当前时间进行比较。如果重置密码的时间尚未到期,则我会显示重置密码的表单,否则我会抛出错误消息。如果时间还没有到期,我会显示表格,当表格提交时,它会被重定向到
update_reset.jsp
,下面是我的update_reset.jsp
页面在这个页面中,我首先验证字段,然后用新密码更新数据库。虽然很长,但很有效。我在这里使用了MD5加密技术,如果你想知道怎么做,请点击链接How to Use MD5 Hash for securing Login passwords in JSP with Javascript?