【问题标题】:How to create paths in RESTful web service for "action oriented" methods?如何在 RESTful Web 服务中为“面向操作”的方法创建路径?
【发布时间】:2013-05-14 07:37:00
【问题描述】:

我正在创建一个 RESTful Web 服务,并尝试遵循惯例和建议来创建一个好的 Web 服务。现在我已经停下来了。我的系统中有一个用户实体,我有常规的 CRUD 路径。我想公开一个 API 来处理忘记的密码。它将在请求中获取用户名,然后检查是否找到用户。如果确实如此,它将更改密码并将密码更改为自动生成的密码并向用户发送电子邮件。

我读到了这个:RESTful actions/services that don't correspond to an entity?,我发现我也许应该开始将非数据库实体也视为资源。

但我仍然无法在我的 API 中找到忘记密码的概念。

我可以为路径命名什么以及适合它的 HTTP 方法?是否应该使用 PUT,因为它会使用新密码更新用户?

【问题讨论】:

  • “我想公开一个 API 来处理忘记的密码。” 它将如何处理它们?它到底会做什么?

标签: java spring rest jakarta-ee spring-mvc


【解决方案1】:

我认为你的方法有明显的弱点。认为您公开了为用户生成新密码的 URL,例如:POST 到 URL http://mycompany.com/app/user/foobar/resetpassword

显然这个 URL 不能被密码保护:否则使用忘记密码的用户无法重置它。好的,这意味着知道用户名的每个人都可以重置用户的密码。甚至每 5 秒一次。或毫秒...酷!

这意味着您必须以某种方式保护您的系统免受这种“天真的”黑客的攻击。

我最近实施了类似的系统,可以向您推荐我的解决方案。

  1. 公开允许启动进程的开放 URL,例如http://mycompany.com/app/user/foobar/resetpassword。此 URL 不会更改密码。它只是创建包含另一个可点击 URL 的电子邮件,例如 http://mycompany.com/app/user/resetpassword/UNIQUETOKEN。令牌是您无法猜测的。
  2. 用户收到电子邮件并单击链接。这次更改了密码,并将相应的电子邮件发送到同一电子邮件。

这种机制可以保护您的系统免受天真的黑客攻击和偶尔按下的“重置密码”按钮,因为第一个操作实际上并没有更改密码。只有可以访问其电子邮件的用户才能真正更改密码。

关于令牌生成。最好的解决方案是将令牌到密码更改请求的映射存储在数据库中,这样您就可以限制点击尝试并使请求过期超时。由于某些原因,我实现了更简单的解决方案:令牌实际上包含加密的用户名和请求密码的日期,所以我实现了请求过期但不能限制对包含 URL 的令牌的点击次数。 然而,实现非常简单且无状态。

【讨论】:

    【解决方案2】:

    我想公开一个 API 来处理忘记的密码。它将在请求中获取用户名,然后检查是否找到用户。如果确实如此,它将更改密码并将密码更改为自动生成的密码并向用户发送电子邮件。

    如果你真的想成为 RESTful:

    我可以为路径命名什么以及适合它的 HTTP 方法?

    它不是PUT 也不是GET,因为它们是幂等方法(意味着您执行它们一次或 10 次应该会得到完全相同的结果)并且您想要的不是:如果请求 10 次,则 10会生成不同的密码。

    还有其他的原因,不过上面说的很简单,不用怀疑。所以是POST

    关于 URL,由于password 可以被视为user子资源(一部分),考虑到user 资源http://www.example.com/rest/user 的URL,它是有意义的将密码 URL 设计为:

    http://www.example.com/rest/user/password
    

    这样,如果有人想设置密码,他应该使用新密码向该 URL 发送 PUT(幂等行为!)。

    现在是密码重置操作,我会将其设为该 URL 的 POST,可能包含一些更具体的内容,例如 password-reset 和一些必要的关键字(秘密的答案问题,也许)在POST 正文中。如果该内容没有出现,400 Bad Request 响应将是合适的。如果请求者尝试过多,则应在“重试等待期”期间发出403 Forbidden。不用说,PUTPOST 都应该发生在一个安全、加密(HTTPS,有人吗?)的通道中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2023-03-08
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      相关资源
      最近更新 更多