我正在为一家具有安全意识的大型公司设计一个 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 令牌特定于单个客户端),但我不知道普通工具是否可以处理。
你认为我们应该如何进行?