协慌网

登录 贡献 社区

保护 REST API / Web 服务的最佳实践

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

构建 SOAP API 时,您需要使用 WS-Security 作为指南,并且有很多关于该主题的文献。我发现有关保护 REST 端点的信息较少。

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

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

答案

正如 tweakt 所说,亚马逊 S3 是一个很好的模型。他们的请求签名确实具有一些功能(例如合并时间戳),有助于防止意外和恶意请求重放。

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

一旦建立了客户端的身份,授权实际上只是一个实现问题。但是,您可以使用现有授权模型将授权委派给其他组件。关于 Basic 的优点还在于您的服务器最终会得到客户密码的纯文本副本,您可以根据需要将其简单地传递到基础架构中的另一个组件。

除 HTTP 之外,没有 REST 标准。那里有成熟的 REST 服务。我建议你看看他们,并了解他们的工作方式。

例如,我们在开发自己的 S3 REST 服务时借用了很多想法。但我们选择不使用基于请求签名的更高级安全模型。更简单的方法是基于 SSL 的 HTTP Basic 身份验证。你必须决定什么在你的情况下最有效。

另外,我强烈推荐 O'reilly 的RESTful Web Services一书。它解释了核心概念并确实提供了一些最佳实践。您通常可以采用他们提供的模型并将其映射到您自己的应用程序。

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

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