【问题标题】:API Keys vs HTTP Authentication vs OAuth in a RESTful APIRESTful API 中的 API 密钥与 HTTP 身份验证与 OAuth
【发布时间】:2011-10-09 17:10:54
【问题描述】:

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

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

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

【问题讨论】:

  • 你最后做了什么?
  • @Irwin - 我很久以前就问过这个问题,并且已经从需要它的项目中移开,但我最终使用了 API 密钥和生成的密码(用户从未见过)的组合,使用 HTTP 身份验证发送。

标签: security api restful-authentication


【解决方案1】:

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

为了访问由 REST 端点公开的一个资源或一组资源,需要根据其身份检查请求者的权限。然后,工作流程的第一步是通过验证请求来验证身份;后续步骤是根据一组定义的规则检查身份,以授权访问级别(即读、写或读/写)。一旦完成了上述步骤,一个典型的进一步关注是允许的请求速率,这意味着请求者每秒被允许对给定资源执行多少个请求。

OAuth (Open Authorization)委托访问的标准协议,主要互联网公司经常使用它来授予访问权限而无需提供密码。很明显,OAuth 是满足上述问题的协议:通过代表资源所有者提供对服务器资源的安全委托访问来进行身份验证和授权。它基于访问令牌机制,允许第 3 方代表资源所有者访问服务器管理的资源。例如,一旦 John 授权了委托,ServiceX 想要代表 John 访问 John Smith 的 Google 帐户;然后 ServiceX 将被颁发一个基于时间的令牌来访问 Google 帐户的详细信息,很可能是只读访问。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    • 身份 - 谁声称发出 API 请求?
    • 身份验证 - 他们真的是他们所说的那样吗?
    • 授权——他们是否可以做他们想做的事?

    还是三个?

    如果您只需要识别调用者来跟踪 API 调用的数量或数量,请使用简单的 API 密钥。请记住,如果您已颁发 API 密钥的用户与其他人共享该密钥,他们也将能够调用您的 API。

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

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

    【讨论】:

    • “某些资源”是指“某些 api 调用”还是“某些数据库记录”,还是两者兼而有之?
    • 主要是数据库记录(或任何显示受保护状态或修改状态的内容)。但它也可能是类似于高级功能(例如在云上运行算法),它不会真正改变数据库上的任何内容,但会使用系统资源,并且应该只对授权的个人可用。
    • @Sid 我正在开发一个应用程序,它使用 OAuth 来注册注册 Facebook 或 LinkedIn 的用户。此外,我们正在为其他服务开放我们的 API 来管理数据。在这种情况下,您是否会为用户身份验证推荐 OAuth,并为访问 API 的服务推荐一个 api 密钥或用户名和密码的组合(如您链接到的文章中)? OAuth 和 api 密钥都用于不同的目的,对吧?
    • @TomDoe 嗨,汤姆 - 是的,这是有道理的。您现在可能想使用 OAuth2。如果您的服务器使用 Python(Django 或 Flask),请查看 github.com/omab/python-social-auth
    • 我不明白 API 密钥怎么不能提供这三样东西。身份和身份验证都基于“您知道特定的秘密吗?” (除非您介绍 2FA,这是一个单独的主题)。如果我给用户 5 的很长的 API 密钥,则声称并证明我是用户 5,至少与用户名/密码一样。而且没有理由不能为不同的 API 密钥分配不同的权限。正确的?我在这里错过了什么?
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 2019-11-13
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2019-09-04
    • 2014-12-05
    相关资源
    最近更新 更多