在设计REST API或服务时,是否有处理安全性(身份验证、授权、身份管理)的最佳实践?

在构建SOAPAPI时,您可以将WS-Security作为指南,并且有许多关于该主题的文献。我发现关于保护REST端点的信息较少。

虽然我理解REST故意没有类似于WS-*的规范,但我希望已经出现了最佳实践或推荐的模式。

如有任何讨论或相关文件的链接,我们将不胜感激。如果重要的话,我们将使用WCF和POX/JSON序列化消息,用于使用.NET Framework v3.5构建的REST API/服务。


当前回答

我推荐OAuth 2/3。更多信息请访问http://oauth.net/2/

其他回答

我使用了OAuth几次,也使用了一些其他方法(BASIC/DIGEST)。我衷心建议OAuth。以下链接是我见过的关于使用OAuth的最佳教程:

http://hueniverse.com/oauth/guide/

正如twitt所说,AmazonS3是一个很好的模型。它们的请求签名确实具有一些特性(如包含时间戳),有助于防止意外和恶意请求重放。

HTTP Basic的优点是几乎所有的HTTP库都支持它。当然,在这种情况下,您需要使用SSL,因为通过网络发送明文密码几乎是一件普遍的坏事。使用SSL时,Basic比Digest更好,因为即使调用方已经知道需要凭据,Digest也需要额外的往返来交换nonce值。使用Basic,调用者只需在第一次发送凭证。

一旦确定了客户机的身份,授权实际上只是一个实现问题。但是,您可以将授权委托给具有现有授权模型的其他组件。同样,Basic的好处是,您的服务器最终提供了客户端密码的明文副本,您可以根据需要将其传递给基础架构中的另一个组件。

OWASP(开放Web应用程序安全项目)有一些涉及Web应用程序开发各个方面的备忘单。本项目是非常有价值和可靠的信息来源。关于REST服务,您可以检查:https://www.owasp.org/index.php/REST_Security_Cheat_Sheet

您可能还想看看OAuth,这是一种新兴的基于令牌的授权开放协议,专门针对http api。

它与flickr所采用的方法非常相似,并记住牛奶“rest”api(不一定是restful api的好例子,而是基于令牌的方法的好例子)。

我有点惊讶的是,还没有提到带有客户端证书的SSL。当然,只有当您能够依靠证书识别用户群体时,这种方法才真正有用。但许多政府/公司确实向其用户发放了这些证书。用户不必担心创建另一个用户名/密码组合,并且在每个连接上都建立了身份,因此与服务器的通信可以完全无状态,不需要用户会话。(并非意味着所提及的任何/所有其他解决方案都需要会议)