我想提供重置用户密码的功能。这个电话显然不一定要求认证。 首先我想到了这样的事情:
DELETE /users/{id}/password
:生成一个重置令牌,通过电子邮件发送给用户
POST /users/{id}/password
:需要新密码和正文中的有效重置令牌
但问题是,应用程序或网站无法向我提供用户的ID,因为所有可以询问用户的是他的电子邮件地址。
我们的API还有许多其他(未经身份验证的)调用,其中ID不存在,用户只能通过其电子邮件进行识别。
我们在团队中讨论了以下解决方案:
如果我必须在这两者之间做出选择,我会选择第一个,因为我认为提供查询参数必不可少的东西并不是RESTful,因为它们总是代表可选的东西,比如过滤资源。 是否有更好的方法来设计这些URL,或者是否正在将用户电子邮件替换为关于REST约束的电子邮件?
答案 0 :(得分:0)
POST /passwordResets
{
"emailAddress": "bob@example.com"
}
然后您也可以灵活地通过userId进行重置,并且您可以跟踪任何其他资源一样跟踪重置以进行审核。
在您的两个选项中,如果您可以使用电子邮件地址来唯一标识用户,那么第一个选项并不可怕。但这在概念上是错误的,因为每个资源应该有一个规范的位置,现在你有两个 - /users/bob/password
和/users/bob@example.com/password
。
第二种选择是错误的。 /users/password
没有意义。 / users的直接含义是下一个路径元素是用户。 /users/password
比REST更接近RPC。