REST身份验证:将密钥放入自定义标头还是Authorization标头?

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令牌时,我们不需要客户端密钥(因为OAuth令牌是针对单个客户的),但我不知道普通工具是否能处理这种情况。
你认为我们应该如何继续进行?

1
FYI,你可以在头部传递HTTP基本身份验证凭据。不需要在URI中传递它们。 - KTastrophy
@KTastrophy 哦...我没有意识到。让我去读一些RFCs。 - mcherm
@KTastrophy [稍后] 不... 根据RFC2617,它使用“Authorization”头,所以这并没有帮助。 - mcherm
好的,那么您想知道如何始终传递一个可能与OAuth身份验证请求一起或不一起的API密钥吗? - KTastrophy
另外,你所说的“普通工具”是指什么? - KTastrophy
是的,我想传递一个API密钥,我可能还想传递一个OAuth令牌。(其中一个用于验证客户端应用程序,另一个提供证据表明它有权访问特定最终用户的数据。)而“正常工具”是指我可能使用的东西,例如Apigee或Mashery,或者与Java的JAX-RS标准相对应的任何内容。基本上,遵循标准的原因是为了使您的工具可以与其他工具配合使用,我关心实现这一点。 - mcherm
1个回答

2
根据您的要求,这里需要自定义标头。
我认为您对它是不良设计选择的担忧在此无关紧要,因为没有标准化的传递API密钥的方式。对于某些应用程序,API密钥是用户ID;对于其他人,它是密码;而对于其他人,它仅是不需要明确身份验证的限流手段。
就兼容性而言,大多数工具允许在与API一起工作时有一定的灵活性,只要您不做任何疯狂的事情,我认为您会没问题。无论您做什么,请确保使用您选择实现的任何标准完全实现(OAuth vs“类似OAuth”),并提供文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接