使用 OAuth 密码凭证授权优于令牌访问身份验证的优势

Advantages of using OAuth Password Credentials Grant over Token Access Authentication

我正在为使用 Rails 5 的移动应用程序创建一个 API。目前,我不需要三足授权,因为 API 只会由我们自己的移动应用程序使用。

我正在考虑选择以下两个选项之一:

  1. Doorkeeper + Devise:我可以使用 Doorkeeper 实现 OAuth 2.0,但我只会使用密码凭证授权,至少现在是这样。
  2. Rails'自己的ActionController::HttpAuthentication::Token模块+设计:这似乎是更简单的方法。

老实说,我看不出 Token Access Authentication method and OAuth 2.0's Password Credentials Grant 之间的区别。

一个人会如何选择一个而不是另一个?还有其他需要考虑的选项吗?

如果您只有 "single purpose API"(仅适用于移动应用程序),那么在安全性方面没有太大区别。

但是,如果您想扩展此 API 以供外部服务使用,那么,使用 Doorkeeper 实施 OAuth 2.0 将处于更有利的位置,因为您可以轻松配置,例如,为他们授予授权码。 所以,我想说 "Doorkeeper + Devise" 选项更适合未来,因为它提供了更多选项,而 HTTP Token authentication 实施起来要简单得多。

两者在概念上是不同的东西:

  • "Token Access Authentication" 指定描述(可能 long-lived)令牌应如何安全地呈现给服务器 的协议。它没有说明令牌来自何处或应如何解释。
  • "Password Credentials Grant" 是 fully-fledged OAuth 流程的一部分,描述了 获取(通常 short-lived)令牌的方法

从某种意义上说,您可以使用密码凭据授予通过 OAuth 获取令牌,然后在 Token 授权 header 中使用此令牌来获得访问权限。

然后问题就变成了——当我们可以使用存储在应用程序中的(永久和秘密)令牌时,为(临时)令牌交换(永久和秘密)凭据进行额外的往返是否有用无论如何立即授权。

在我看来,使用完整的 OAuth 流程有两个潜在的好处。首先,它可以让您自然地为第三方添加其他授权方式。其次,它允许您随时撤销令牌并使用这些其他方式强制 re-authorization(当然,如果您实施它们)而无需发明任何轮子。

另一方面,您以后随时可以在需要时添加任何其他 "token generation" 部分。因此,如果您当前的计划是 hard-code 代码中的凭据,我怀疑您最好依赖 Token 授权。

它不仅一个请求更短,而且可能比 OAuth 中使用的 Bearer 身份验证稍微更安全:如果攻击者嗅探 Bearer 令牌,他们(通常)会得到对服务器的完全令牌访问,直到其到期。 Token 令牌不是这种情况(通常)。当然,如果攻击者无论如何都可以从您的应用程序中提取共享密钥,这并不是什么大问题。