我正在阅读有关OAuth2 https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2的文章。令我困惑的是拨款类型。它说
授权码:与服务器端应用程序一起使用 隐含:用于移动应用程序或Web应用程序(在用户设备上运行的应用程序)
那么服务器端应用程序和网络应用程序之间的区别是什么呢?他们不一样吗?任何人都可以举例说明何时使用这两种授权类型?感谢。
答案 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个主要部分:
要了解它们在所有4种OAuth2授予类型之间的区别,我们来看一幅将它们进行并行比较的图像。
图片来源: https://blog.oauth.io/understand-oauth2-grant-types-by-spotting-the-difference/
授权码(右上角):
隐含(右下角):
注释:
有了这些了解,您现在可以回答自己的问题:
服务器端应用程序和Web应用程序之间的区别是什么?
服务器端应用程序具有后端,可以在前端和数据存储之间进行中介等。因此,它们可以使用后端充当Guard的方式来实现授权码授予类型,这更加安全。对于不具有/仅位于后端的Web应用程序(单页应用程序),它们需要使用隐式授予类型。