我正在为一家注重安全的大型公司设计一个REST API框架。
我们服务的每个呼叫者都需要提供访问系统的客户端密钥。我们将使用它来授权该特定客户端的访问以及速率限制和监控。此外,我们的一些 API调用将访问客户数据,我们将使用OAuth 2令牌来控制对该数据的访问。
我的问题是如何传递客户端密钥。我不能使用HTTP基本身份验证或查询参数,因为我们无法在URI中传递它(有时会记录URI) - 它必须在HTTP头中。所以我想到了两种方法,都有缺陷:
(1)发明我们自己的标题:MyCompanyAPIKey: api-key-goes-here
。这是有缺陷的,因为我们将发明我们自己的标题,这是一个糟糕的设计选择。它不适用于任何其他人或使用标准工具(因为我们发明了自己的工具)。
(2)使用授权标题:Authorization: Bearer api-key-goes-here
。这是有缺陷的,因为在我们使用它的情况下它会与OAuth(需要标题)冲突。从技术上讲,我认为当我们有OAuth令牌时,我们不需要客户端密钥(因为OAuth令牌特定于单个客户端),但我不知道普通工具是否可以处理
您认为我们应该如何进行?
答案 0 :(得分:1)
根据您的要求,它听起来像一个自定义标题是这里的方式。
我认为您对这是一个糟糕的设计选择的担忧与此无关,因为没有传递API密钥的标准化方法。 API键对不同的应用程序意味着不同的东西对某些人来说,它是一个用户ID;给别人一个密码;而对于其他人来说,它只是限制的手段,甚至不需要明确的身份验证。
就兼容性而言,大多数工具都允许在使用API方面有一些灵活性,所以只要你不做任何疯狂的事情,我认为你会没事的。无论你做什么,只要确保你选择实施任何标准,你就可以完全实现它们(OAuth vs“OAuth like”)并提供文档。