忘记密码流程的RESTFul API设计建议

3
我正在设计忘记密码流程的Restful API。以下是Web应用程序中使用的流程:
1) User enters user id
2) Application validates user id and sends verification token to user's email address
3) User will be asked for validation code and new password
4) User will enter validation code and new password
5) Application validates token and updates password.

我希望你能够就如何将这个流程转换为Restful API提供建议。

谢谢,
Raj


你的上下文是什么?我的意思是这在过去已经做得很多了。在我们的情况下,我们就像谷歌的Firebase身份验证一样,提供了一整套标准的用户名密码功能,以RESTFul API的形式跨多个应用程序工作。这与使用谷歌密码进行身份验证的谷歌自己的身份验证不同。他们允许您拥有自己的用户和密码,同时提供安全性。作为一个安全人员,我建议使用它来避免安全漏洞和跨平台支持,以及工程的简单性。您还可以轻松添加Google和Facebook。 - David J
1个回答

9

这是一个非常标准的设计,我认为您可以找到许多资源,甚至在一些网站上重置自己的密码并查看它的工作方式。

基础知识:

  • 客户端在发送用户ID时将进行POST请求。注意不要透露用户ID/电子邮件是否有效(以避免暴力破解检查用户ID/电子邮件是否存在)。此外,确保在之前的令牌过期之前不能请求另一个密码重置(以防止DoS攻击)。
  • 如您所说,服务器将检查相关的电子邮件,并最终发送令牌。
  • 实际上没有必要让用户输入验证令牌。就像大多数网站所做的那样,您可以将其嵌入到电子邮件中发送的链接中。记得为令牌设置合理的到期时间(也许是一个小时?)。此处应该已经检查了令牌的有效性。
  • 带有令牌的链接将是对特定页面的GET请求,在该页面上用户会自动获得身份验证,并可以输入新密码(再次记住令牌到期时间)。
  • 用户将使用POST请求输入新密码,您再次检查令牌的有效性,如果一切匹配,则更新密码。

关于POSTGET调用,可以像这样:

  • POST https://www.yoursite.com/resetpassword, 在正文中使用用户ID/电子邮件。不要将用户ID/电子邮件作为查询或路径参数,特别是如果页面上有广告/横幅,因为它们可能能够获取到这些数据。

  • GET https://www.yoursite.com/password?token=dhs3541hpk43hokdsau9ef 其中令牌与重置密码的用户ID/电子邮件相关联(您应该在数据库中拥有此信息)。在此处第一次验证令牌,并且用户可以在表单中输入新密码。请注意,这可以是用户更改密码时使用的相同表单,只是没有“旧密码”字段。请注意,您不能在此页面上放置横幅/广告,这将是严重的安全风险。

  • POST https://www.yoursite.com/password?token=dhs3541hpk43hokdsau9ef 在正文中使用新密码。再次,请勿在此页面上放置横幅/广告。服务器将再次检查令牌,如果匹配,则更新密码。然后,服务器将标记令牌为无效/已过期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接