针对未经身份验证的请求的RESTful URL设计

时间:2014-04-07 20:50:27

标签: rest url-design

我想提供重置用户密码的功能。这个电话显然不一定要求认证。 首先我想到了这样的事情:

DELETE /users/{id}/password:生成一个重置令牌,通过电子邮件发送给用户

POST /users/{id}/password:需要新密码和正文中的有效重置令牌

但问题是,应用程序或网站无法向我提供用户的ID,因为所有可以询问用户的是他的电子邮件地址。

我们的API还有许多其他(未经身份验证的)调用,其中ID不存在,用户只能通过其电子邮件进行识别。

我们在团队中讨论了以下解决方案:

  • 使用用户电子邮件替换URL中的ID
  • 从网址中删除ID并为电子邮件提供查询参数

如果我必须在这两者之间做出选择,我会选择第一个,因为我认为提供查询参数必不可少的东西并不是RESTful,因为它们总是代表可选的东西,比如过滤资源。 是否有更好的方法来设计这些URL,或者是否正在将用户电子邮件替换为关于REST约束的电子邮件?

1 个答案:

答案 0 :(得分:0)

POST /passwordResets
{
    "emailAddress": "bob@example.com"
}

然后您也可以灵活地通过userId进行重置,并且您可以跟踪任何其他资源一样跟踪重置以进行审核。

在您的两个选项中,如果您可以使用电子邮件地址来唯一标识用户,那么第一个选项并不可怕。但这在概念上是错误的,因为每个资源应该有一个规范的位置,现在你有两个 - /users/bob/password/users/bob@example.com/password

第二种选择是错误的。 /users/password没有意义。 / users的直接含义是下一个路径元素是用户。 /users/password比REST更接近RPC。