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


101

我正在为我维护的应用程序之一构建RESTful API。目前,我们正在寻找将需要更多控制访问和安全性的各种功能集成到其中。在研究如何保护API时,我发现了关于使用哪种形式的几种不同观点。我已经看到一些资源说HTTP-Auth是必经之路,而其他资源则更喜欢API密钥,甚至其他(包括我在SO上找到的问题)也都由OAuth宣誓。

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

那么,我的问题是-假设所有操作都通过HTTPS完成,这三者之间的实际区别是什么?什么时候应该考虑一个?


你最终要做什么?
Irwin,2013年

@Irwin-我很早以前就问过这个问题,此后就从需要它的项目继续进行,但最终我使用了API密钥和生成的密码(用户从未看到过)的组合,这些密码是使用HTTP身份验证发送的。
Shauna 2013年

Answers:


67

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

  • 身份–谁声称正在提出API请求?
  • 身份验证–他们真的是他们所说的吗?
  • 授权–是否允许他们做自己想做的事情?

还是全部三个?

如果您只需要识别调用方以跟踪API调用的数量或数量,请使用简单的API密钥。请记住,如果您已发布API密钥的用户与他人共享它,那么他们也将能够调用您的API。

但是,如果您还需要授权,即只需要基于API调用者提供对某些资源的访问权限,然后使用oAuth。

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


对于“某些资源”,您是指“某些api调用”还是“某些数据库记录”,或两者兼而有之?
Magne

通常是数据库记录(或任何显示保护状态或修改状态的记录)。但这也可能是高级功能(例如在云上运行算法)之类的功能,它实际上并没有改变数据库上的任何内容,而是使用系统资源,并且仅对授权人员可用。
2015年

@Sid我正在开发一个使用OAuth来注册使用Facebook或LinkedIn进行注册的用户的应用程序。此外,我们正在开放API供其他服务使用,以管理数据。在这种情况下,您是否建议使用OAuth进行用户身份验证,并为访问API的服务推荐api密钥或用户名和密码的组合(如您链接的文章中所述)?OAuth和api键都用于不同的目的,对吗?
汤姆·多伊

@TomDoe嗨,汤姆-是的,这很有道理。您可能现在想使用OAuth2。如果您的服务器使用Python(Django或Flask),请访问github.com/omab/python-social-auth
Sid

我不明白API密钥不能提供这三件事。身份和身份验证均基于“您知道特定的秘密吗?”。(除非您介绍2FA,这是一个单独的主题)。如果我提供了用户5的很长的API密钥,那么它将声明并证明我是用户5,至少与用户名/密码一样。而且没有理由不能为不同的API密钥分配不同的权限。对?我在这里想念什么?
内森·朗

3

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

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

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

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

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

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

两种类别都使用传统的身份验证工作流与拥有感兴趣资源的服务器进行首次交互。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.