3

我正在为一家具有安全意识的大型公司设计一个 REST API 框架。

我们服务的每个调用者都需要提供一个客户端密钥来访问系统。我们将使用它来授权该特定客户端的访问以及速率限制和监控。此外,我们的一些API 调用将访问客户数据,我们将使用 OAuth 2 令牌来控制对该数据的访问。

我的问题是如何传递客户端密钥。我不能使用 HTTP 基本身份验证或查询参数,因为我们不能在 URI 中传递它(有时会记录 URI)——它必须在 HTTP 标头中。所以我想到了两种方法,都有缺陷:

(1) 发明我们自己的标题:MyCompanyAPIKey: api-key-goes-here. 这是有缺陷的,因为我们将发明自己的标头,这是一个糟糕的设计选择。它不适用于其他任何人或标准工具(因为我们发明了自己的工具)。

(2) 使用 Authorization 标头:Authorization: Bearer api-key-goes-here. 这是有缺陷的,因为在我们使用它的情况下,它会与 OAuth(需要该标头)冲突。从技术上讲,我想当我们有 OAuth 令牌时我们不需要客户端密钥(因为 OAuth 令牌特定于单个客户端),但我不知道普通工具是否可以处理。

你认为我们应该如何进行?

4

1 回答 1

2

鉴于您的要求,它听起来像自定义标头是这里的方式。

我相信您对它是一个糟糕的设计选择的担忧在这里无关紧要,因为没有标准化的方法来传递 API 密钥。API 密钥对不同的应用程序意味着不同的东西。对某些人来说,它是一个用户 ID;对其他人来说,它是一个密码;对于其他人来说,它仍然只是一种节流手段,甚至不需要明确的身份验证。

就兼容性而言,大多数工具都允许在使用 API 方面具有一定的灵活性,只要你不做任何疯狂的事情,我认为你会没事的。无论您做什么,只要确保您选择实施的任何标准都完全实施(OAuth 与“OAuth like”)并提供文档。

于 2013-09-07T17:42:35.550 回答