我正在为一家注重安全的大型公司设计REST API框架。
我们的每个服务调用者都需要提供客户端密钥才能访问系统。我们将使用它来授权访问特定客户以及进行速率限制和监控。此外,我们的某些API调用将访问客户数据,我们将使用OAuth 2令牌来控制对该数据的访问权限。
我的问题是如何传递客户端密钥。我不能使用HTTP基本身份验证或查询参数,因为我们不能将其传递到URI中(有时URI会被记录)--它必须在HTTP标头中。因此,我想到了两种方法,但都有缺陷:
(1)发明我们自己的标头:
(2)使用Authorization标头:
你认为我们应该如何继续进行?
我们的每个服务调用者都需要提供客户端密钥才能访问系统。我们将使用它来授权访问特定客户以及进行速率限制和监控。此外,我们的某些API调用将访问客户数据,我们将使用OAuth 2令牌来控制对该数据的访问权限。
我的问题是如何传递客户端密钥。我不能使用HTTP基本身份验证或查询参数,因为我们不能将其传递到URI中(有时URI会被记录)--它必须在HTTP标头中。因此,我想到了两种方法,但都有缺陷:
(1)发明我们自己的标头:
MyCompanyAPIKey:api-key-goes-here
。这有缺陷,因为我们将会发明自己的标头,这是一个很糟糕的设计选择。它将无法与其他人或标准工具配合使用(因为我们发明了自己的标头)。(2)使用Authorization标头:
Authorization: Bearer api-key-goes-here
。这有缺陷,因为在使用OAuth的情况下它将与OAuth发生冲突(需要该标头)。从技术上讲,我认为当我们拥有OAuth令牌时,我们不需要客户端密钥(因为OAuth令牌是针对单个客户的),但我不知道普通工具是否能处理这种情况。你认为我们应该如何继续进行?