RESTful API中的API密钥与HTTP身份验证与OAuth

时间:2011-07-20 20:05:09

标签: security api restful-authentication

我正在为我维护的其中一个应用程序构建RESTful API。我们目前正在寻求构建各种需要更多受控访问和安全性的东西。在研究如何保护API时,我发现了一些关于使用什么形式的不同意见。我已经看到一些资源说HTTP-Auth是要走的路,而其他人更喜欢API密钥,甚至其他人(包括我在SO上找到的问题)都发誓OAuth。

然后,当然,那些喜欢API密钥的人说,OAuth是为代表用户访问的应用程序而设计的(据我所知,例如使用Facebook登录非Facebook网站)帐户),而不是用户直接访问他们专门注册的网站上的资源(例如访问Twitter服务器的官方Twitter客户端)。但是,OAuth的建议似乎甚至是最基本的身份验证需求。

我的问题是 - 假设它都是通过HTTPS完成的,三者之间有哪些实际差异?什么时候应该考虑其他人?

2 个答案:

答案 0 :(得分:64)

这取决于您的需求。你需要:

  • 身份 - 谁声称要发出API请求?
  • 身份验证 - 他们真的是他们所说的人吗?
  • 授权 - 允许他们做他们想做的事吗?

还是全部三个?

如果您只需要识别呼叫者以跟踪API呼叫的数量或数量,请使用简单的API密钥。请记住,如果您发布API密钥的用户与其他人共享,则他们也可以调用您的API。

但是,如果您还需要授权,那么您需要仅根据API的调用者提供对某些资源的访问权限,然后使用oAuth。

以下是一个很好的描述:http://www.srimax.com/index.php/do-you-need-api-keys-api-identity-vs-authorization/

答案 1 :(得分:0)

API密钥甚至令牌属于直接身份验证和授权机制,因为它们授予对REST API公开资源的访问权限。这种直接机制可用于委派用例。

为了获得对REST端点公开的一个资源或一组资源的访问,需要根据其身份检查请求者特权。然后,工作流程的第一步是通过认证请求来验证身份;后续步骤是对照一组定义的规则检查身份,以授权访问级别(即读取,写入或读取/写入)。完成上述步骤后,另一个典型的问题是允许的请求速率 ,即允许请求者每秒对给定资源执行多少个请求。

OAuth (Open Authorization)是用于授权访问的标准协议,主要互联网公司通常使用该协议在不提供密码的情况下授予访问权限。很明显,OAuth是一种协议,它满足了上述关注点:身份验证和授权,通过代表资源所有者提供对服务器资源的安全委派访问。它基于访问令牌机制,该机制允许第三方代表资源所有者访问服务器管理的资源。例如,一旦John授权了代表团,ServiceX便要代表John访问John Smith的Google帐户。然后,将向ServiceX发出基于时间的令牌,以访问Google帐户详细信息,很可能仅以只读访问权限。

API密钥的概念与上述OAuth令牌非常相似。主要区别在于没有委托:用户直接向服务提供商请求密钥以进行连续的程序交互。 API密钥的情况也是基于时间的:作为OAuth令牌的密钥受时间租约或有效期限制。 另外,密钥和令牌可能会受到服务合同的速率限制,即每秒只能处理给定数量的请求。

回顾一下,实际上,传统的身份验证和授权机制与基于密钥/令牌的版本之间并没有真正的区别。不过,该范例略有不同:与其在客户端与服务器之间的每次交互中均不重用凭据,而是使用了支持密钥/令牌,该密钥/令牌使整体交互体验更加顺畅且可能更安全(通常,遵循JWT标准,密钥和令牌由服务器进行数字签名,以避免进行伪造。

  • 直接身份验证和授权:基于密钥的协议,是传统的基于凭据的版本的变体。
  • 委托的身份验证和授权:类似于基于OAuth的协议,该协议又使用令牌,再次作为基于凭据的版本的变体(总体目标是不将密码公开给任何第三方)。

这两个类别在与拥有感兴趣资源的服务器的第一次交互中都使用传统的身份验证工作流程。

相关问题