我将首先指出认证通常是在REST模型之外处理的。当用户提供他们的凭证时,他们没有提供其帐户对象的状态(REST)的重新呈现;他们也没有收到这样的表示。由于用户帐户资源状态不包含“当前”和“新”密码,因此在请求中提供“当前”和“新”密码永远不能真正适合REST模型,但专业人员通常会描述RESTfulness'continuum',其中一些API完全是RESTful,另一些则介于RPC(远程过程调用)和REST之间。
拥有处理数据模型服务的API的RESTful组件以及处理用户帐户的API的更多RPC组件并不少见。你可以在两者之间做出决定。如果您的项目包含管理多个用户帐户的超级用户,我会建议尝试将它变成REST API。如果每个用户只管理他们自己的帐户,我会建议RPC。
如果您已决定使用REST进行帐户管理,那么您必须选择适当的HTTP方法(GET,POST,DELETE,HEADERS等)。显然你需要一个方法来影响服务器的变化(POST,PUT,DELETE等)。与上面的用户orbfish的结论相反,我要说的是,在某些限制下,PUT将是一个合适的方法。
从RFC 2616,正式定义了我们的HTTP方法:
“的方法还可以具有‘幂等性’的属性在(除了错误或过期的问题)N的副作用> 0相同请求是相同的单个请求。该方法GET,HEAD,PUT和DELETE共享这个属性。此外,所述方法OPTIONS和TRACE不应该有副作用,所以是固有幂等的。“
幂等性这意味着如果我们提出同样的要求n次连续,服务器在和 th请求的影响下的状态将与服务器在第一个请求的影响下的状态相同。用户orbfish正确地指出,如果我们发出请求:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
和重复:
PUT /users/:id/account {current-password: 'a', new-password: 'b'}
,我们的第一个请求应该得到指示成功和我们的第二个请求应该收到一个表示失败的响应的响应。但是,PUT的幂等性只要求服务器的状态在两个请求之后都是相同的。它是:第一次请求后用户的密码是'b',第二次请求后用户的密码是'b'。
我上面提到了限制。您可能想在m尝试更改密码失败后锁定用户;这将为暴力密码攻击提供安全保障。但是,这会破坏请求的幂等性:一次发送有效的密码请求,并且您更改密码,将其发送m多次,服务器将您锁定。
通过指定PUT方法,您可以告诉所有客户端根据需要多次发送请求是安全的。如果我作为客户端发送PUT请求,并且我们的连接中断,以至于我没有收到您的回复,我知道再次发送PUT是安全的,因为它是幂等的:幂等性意味着如果您收到两个请求将与您的服务器相同,只是接收一个。但是如果你想锁定我不成功的请求,那么发送第二个请求是不安全的,直到我知道你是否收到第一个请求。
因此,您可能会考虑PATCH或POST。我会建议使用PATCH。尽管POST被描述为将新资源附加到列表或将数据附加到现有资源,但PATCH被描述为在已知URI处的资源上的“部分更新”。与PUT不同,PATCH不需要是幂等的。
验证当前密码以防止恶意攻击(经过身份验证的用户尝试更改具有更多权限的用户的密码)。 – orbfish