3

从巴黎的 Symfony Live 2012 回来,我很幸运地参加了“设计 HTTP 接口和 RESTful Web 服务”会议,我对如何构建一个 RESTful API 并同时保持其私有和成员身份提出了很多问题。

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

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

但是根据演讲(以及我在网上阅读的其他资源),这不是正确的做法。

我的需求如下:

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

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

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

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

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

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

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

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

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

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

4

1 回答 1

1

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

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

如果您非常关心安全性,尽管您不信任第三方会为您处理它,那么您将希望遵循OAuth 协议

于 2012-06-13T01:30:56.837 回答