如何在私有和仅限成员的情况下构建一个 RESTFUL API


How to build a restful api while being private and members only?

从巴黎的Symfony Live 2012回来,我有幸参加了"设计HTTP接口和RESTful Web服务"会议,我有很多关于如何构建RESTful API的问题,同时保持其私有和仅限成员。

目前,我曾经生成一个API密钥以使我的API私有(我的意思是可供我自己但最终用户的第三方应用程序使用)。

为了确保注册的用户可以使用API(通过移动应用程序),我使用Cookie,好吧,我使用了SESSION。

但是afaik,根据谈话(以及我在网上阅读的其他资源),这不是正确的方法。

我的需求如下:

  • 提供只有我的移动应用程序才能使用的私有 API
  • 允许成员(不同角色)执行不同的操作(即:成员可以发表评论,而管理员可以编辑所有评论)

由于 REST 约束是无状态的(以及其他约束),我无法使用 Cookie/会话,因为它们需要由客户端启动,并且会导致一些非幂等结果。

我在这里和那里读到,保持我的API RESTful的一种方法是在每个请求中提供凭据。

目前,为了验证我的API密钥(使其保密),我使用自定义HTTP授权方案,类似于Authorization: MyApp SoMeToKeNV3RYPR!V4T3,然后使用POST方法对我的成员(登录)进行身份验证(就像在任何浏览器Web应用程序中所做的那样)。

您将如何实施此类案件?是否可以接受使用这种私有方案并继续使用会话?

经过一些阅读,我可能认为在每个请求上使用一些签名可以帮助解决这些问题。

签名可以使用第三方客户端中提供的用户凭据生成,同时使用公钥/私钥对其进行加密(以保持 API 的私密性)。

在每个请求中,将根据CRC(或类似的东西)检查签名,而凭据将针对数据库进行检查(这似乎不值得检查会话,是吗?

任何帮助/建议将不胜感激。

PS:OAuth呢?我对此了解不多,但它可能是此类问题的解决方案吗?

你肯定想使用OAuth。这将允许您安全地验证您的用户是否是他们所说的人。您不需要弄乱CRC或任何东西,一旦用户通过身份验证,他们就拥有可用于签署未来请求的访问令牌。

您只需要处理身份验证方案和握手,然后在分发访问令牌后安全地存储访问令牌。但是,如果是我,我不相信自己在设计这样的系统时会处理所有安全案例。有几个第三方PaaS公司会为你做这种事情。我知道以下公司有一些 API 管理工具可能会对您有所帮助,并且他们也处理 OAuth 实现:

  • 阿皮吉
  • 第 7 层
  • 平身份

如果您非常关心安全性,但不信任第三方为您处理它,那么您将需要遵循OAuth协议。