关于OAuth2授权类型

时间:2017-10-26 10:20:08

标签: security oauth-2.0

我正在阅读有关OAuth2 https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2的文章。令我困惑的是拨款类型。它说

授权码:与服务器端应用程序一起使用 隐含:用于移动应用程序或Web应用程序(在用户设备上运行的应用程序)

那么服务器端应用程序和网络应用程序之间的区别是什么呢?他们不一样吗?任何人都可以举例说明何时使用这两种授权类型?感谢。

4 个答案:

答案 0 :(得分:1)

我想将授予视为一种事物,比如一枚硬币,将访问令牌视为另一种事物,一把打开大门的钥匙。

要获取钥匙,您将需要交出硬币。接受哪种硬币?

好吧,您可以交出上面写有密码的硬币。这表明您知道您的密码,因此,硬币被接受并且您获得了钥匙。这是“资源所有者密码凭据”授予。

Web服务器可以建立一个登录表单,然后用户输入Web服务器可以看到的密码。 Web服务器使用密码来获取密钥。

连同键一样,您可能还已经获得了刷新令牌。因此,稍后,您可以交出印有刷新令牌的硬币。此硬币被接受,您会获得一个新钥匙。这是“刷新令牌”授予。

您可能不知道密码。您的父母会为您跟踪密码。您要求父母为您获取“代码”。他们与当局交谈并提供密码,然后收到他们提供给您的密码。现在,您可以将代码放在硬币上,交出硬币,然后领取钥匙。您没有看到密码,您的父母也没有看到密钥。这是授权码授予。

网络服务器要求您“使用Google登录”。 Google要求您输入密码,并提供授权码,该授权码将被传递回Web服务器。网络服务器可以从Google获取密钥,而无需输入密码。

您可能与当局有特殊关系,并且拥有秘密。您不需要密码。在这种情况下,您可以将此秘密放在硬币上,然后将其换成钥匙。这是“客户证书”授予。

您可能是后端服务器,需要密钥,但没有用户名或密码。您只需要一个秘密即可获取密钥。

如果您是VIP,甚至不需要投币!您可以挥舞双手,然后领取钥匙。这是一个“隐式”硬币-即没有硬币!这是隐性补助。

您可能是一个电话应用程序,实际上没有安全的地方可以保密,因此您只需挥手就可以获取密钥。

答案 1 :(得分:0)

这很安全,所以很复杂。好吧不太复杂。

首先,您需要确定您的OAuth客户端(即您的应用程序)是否为“Public or Confidential

最好的规则是遵循RFC 6749 Section 1.3.2    “隐性拨款可以提高某些人的反应能力和效率    客户端(例如作为浏览器内应用程序实现的客户端),    因为它减少了获得一次所需的往返次数    访问令牌。但是,应该权衡这种便利性    使用隐式授权的安全含义,例如那些    在第10.3和10.16节中描述,尤其是当    授权代码授予类型可用。“

答案 2 :(得分:0)

授权代码授予提供了额外的安全性,适用于提供服务器会话的应用程序。通过分离用户代理和客户端来提供附加安全性。例如。 Web浏览器(用户代理)在Stackexchange(客户端)上使用Facebook帐户登录。由于客户端Web应用程序(服务器)可以安全地获取访问令牌并将其存储,因此令牌受到危害的风险较小。

隐式代码授予不太安全,只有在没有Web服务器或没有服务器会话时才会选择(例如本机移动应用程序,javascript应用程序)。由于用户代理必须获取令牌,因此拥有中间凭证(例如授权代码)并稍后获取访问令牌是没有意义的。

这可能会有助https://oauth2.thephpleague.com/authorization-server/which-grant/

答案 3 :(得分:0)

您可以将每种OAuth授权类型视为一个流程。在OAuth2中,有4种不同的授权类型。

每种授予类型都是相似的,因为每个都有2个主要部分:

  1. 该应用从用户那里获得授权密钥/访问令牌
  2. 应用程序使用密钥/访问令牌代表用户执行操作(例如,每天12pm在Tweeter上发布)

要了解它们在所有4种OAuth2授予​​类型之间的区别,我们来看一幅将它们进行并行比较的图像。

OAuth2 Grant Types/Flows Comparison and Difference

图片来源: https://blog.oauth.io/understand-oauth2-grant-types-by-spotting-the-difference/

授权码(右上角):

  • 共有5个参与方:用户,应用程序,Guard,OAuth服务器(表示为具有多个密钥的钥匙串),资源服务器(表示为具有多个门的商店)
  • 用户通过提供用户名/密码从OAuth服务器获取密钥/访问令牌,然后“移交给” Guard(后端),而App(前端)只能通过Guard访问资源服务器,因为它无法访问密钥
  • Guard通过常规方式(例如,通过浏览器HTTP会话)识别该应用的用户。

隐含(右下角):

  • 只有4个政党,即没有Guard(后端)
  • 用户通过提供用户名/密码从OAuth服务器获取密钥,并且由于没有防护,它会“移交给”应用程序(前端)
  • 该应用具有密钥,因此可以直接访问资源服务器

注释:

  • 在隐式授予类型中,密钥位于前端(浏览器)中,因此它容易受到更多的攻击,因此,与授权代码授予类型(密钥位于后端)相比,它的安全性较低。

有了这些了解,您现在可以回答自己的问题:

  

服务器端应用程序和Web应用程序之间的区别是什么?

服务器端应用程序具有后端,可以在前端和数据存储之间进行中介等。因此,它们可以使用后端充当Guard的方式来实现授权码授予类型,这更加安全。对于不具有/仅位于后端的Web应用程序(单页应用程序),它们需要使用隐式授予类型。