【问题标题】:Preventing duplicate REST calls防止重复的 REST 调用
【发布时间】:2016-05-13 13:40:16
【问题描述】:
我正在创建一个 Android 应用程序,它调用基于 PHP 的 REST api 方法进行服务器端更新。
例如,给客户添加奖励积分,我们可以使用:
http://example.com/rest/customer/add/1/20
其中 1 是客户 ID,20 是奖励积分。
我想知道如何防止重复调用此 URL。如果由于某种原因,此 URL 被调用两次,客户将获得 20 分以上。不存在客户不能在同一天获得更多积分的情况。
另外,如何防止这个URL被匿名执行?
OAuth 2.0 是最佳解决方案还是有更好的解决方案?
谢谢
【问题讨论】:
标签:
rest
security
duplicates
【解决方案1】:
解决此问题的 REST/HTTP 方法是向“奖励积分”资源发出“有条件的”POST 请求。
对POST 20 分的请求如下所示:
POST /customer/1/points HTTP/1.1
If-Match: "0"
Host: ...
20
If-Match 标头意味着 POST 只有在您尝试修改的资源仍然具有指定的状态时才应该完成。在这种情况下,如果客户有 0 点,则 20 点将仅是 POSTed。可以将其视为optimistic locking 机制。
如果 If-Match 前提条件失败,通常服务器应返回错误代码 412(前提条件失败)。
注意:客户的积分应该是资源。
为防止未经授权访问积分,您的服务器必须实施某种身份验证机制。如果用户未通过身份验证,最简单的方法是使用 401(未授权)响应。如果用户通过了认证,只是无权更新某些点,返回403(Forbidden)。