当前位置: 首页 > 知识库问答 >
问题:

为什么在“隐式”流工作得这么好的情况下,OAuth2中还有一个“授权码”流呢?

仇正平
2023-03-14

通过“隐式”流,在资源所有者(即用户)给予访问权之后,客户端(可能是浏览器)将获得一个访问令牌。

然而,对于“授权代码”流,客户端(通常是web服务器)仅在资源所有者(即用户)给予访问权之后才获得授权代码。使用该授权代码,客户机然后对API进行另一次调用,传递client_id和client_secret以及授权代码,以获得访问令牌。这里都有很好的描述。

这两个流具有完全相同的结果:访问令牌。不过,“隐性”流动要简单得多。

问题是:为什么要费心于“授权码”流量,当“隐性”流量接缝就好了?为什么不对WebServer也使用“隐式”呢?

共有1个答案

柴博
2023-03-14

TL;DR:这都是因为安全原因。

OAuth 2.0希望满足以下两个标准:

  1. 您希望允许开发人员使用非HTTPS重定向URI,因为并非所有开发人员都有启用SSL的服务器,而且如果他们这样做了,它并不总是正确配置(非自签名、受信任的SSL证书、同步的服务器时钟……)。
  2. 您不希望黑客能够通过拦截请求来窃取访问/刷新令牌。

详情如下:

由于安全原因,隐式流仅在浏览器环境中是可能的:

在隐式流中,访问令牌直接作为散列片段(而不是URL参数)传递。关于哈希片段的一个重要的事情是,一旦您跟踪包含哈希片段的链接,只有浏览器才知道该哈希片段。浏览器将把散列片段直接传递到目标网页(重定向URI/客户端的网页)。哈希片段具有以下属性:

    null

这使得可以将访问令牌直接传递给客户端,而不会有被中间服务器截获的风险。这有一个警告,即只能在客户端使用,并且需要运行客户端的javascript来使用访问令牌。

隐式流还存在需要进一步的逻辑来解决/避免的安全问题,例如:

  • 攻击者可以从不同网站/应用程序上的用户(假设他是其他网站/应用程序的所有者)获取访问令牌,将该令牌记录在他们的网站上,然后将其作为URL参数传递到您的网站上,从而假冒您网站上的用户。为了避免这种情况,您需要检查与访问令牌相关联的客户端ID(例如,对于Google,您可以使用tokeninfoendpoint),以确保令牌是用您自己的客户端ID(即通过您自己的应用程序)发出的,或者如果您正在使用IDToken,则检查签名(但这需要您的客户端机密)。
  • 如果身份验证请求不是源自您自己的属性(称为会话固定攻击),为了避免这种情况,您将希望从您的网站生成一个随机哈希,将其保存在cookie中,并在身份验证请求的状态URL参数中传递相同的哈希,当用户返回时,您将使用cookie检查状态参数,并且它必须匹配。

在授权代码流中,不可能在URL参数中直接传递访问令牌,因为URL参数是HTTP请求的一部分,因此,如果您不使用加密连接(HTTPS),允许所谓的中间人攻击,那么您的请求将通过的任何中间服务器/路由器(可能有数百个)都能够读取访问令牌。

理论上可以在URL参数中直接传递访问令牌,但身份验证服务器必须确保重定向URI使用带有TLS加密的HTTPS和“受信任的”SSL证书(通常来自非免费的证书颁发机构),以确保目标服务器是合法的,并且HTTP请求是完全加密的。让所有开发人员购买SSL证书并在他们的域上正确配置SSL将是一个巨大的痛苦,并且会极大地减缓采用SSL的速度。这就是为什么提供了一个中间的一次性使用的“授权代码”,只有合法的接收者才能够交换(因为您需要客户端机密),并且该代码对于通过未加密的事务拦截请求的潜在黑客将是无用的(因为他们不知道客户端机密)。

您还可以认为隐式流的安全性较低,存在潜在的攻击向量,比如在重定向时欺骗域--例如通过劫持客户端网站的IP地址。这就是为什么隐式流只授予访问令牌(它们应该有一个有限的时间使用)而从不刷新令牌(它们在时间上是无限的)的原因之一。为了解决这个问题,我建议您尽可能将您的网页放在启用HTTPS的服务器上。

 类似资料:
  • 使用“隐式”流,在资源所有者(即用户)给予访问权限后,客户端(可能是浏览器)将获得访问令牌。 然而,在“授权代码”流程中,客户端(通常是web服务器)只有在资源所有者(即用户)给予访问权限后才获得授权代码。使用该授权代码,客户机然后对API进行另一次调用,将client_id和client_secret与授权代码一起传递,以获得访问令牌。这里都描述得很好。 问题是:当“隐式”流接缝很好时,为什么还

  • null 现在,我仍然困惑的是,登录验证应该从哪里来(登录用户名-密码)?是否在转到OAuth流之前进行单独的验证,一旦用户有效,它就应该回到流中?

  • 双腿OAuth2用于基于浏览器的应用程序,在这种应用程序中,任何客户端凭据都不能对公众隐藏。“Web服务器应用程序”使用三条腿的OAuth2,其中服务器之间有第三个呼叫。这里描述得很好。 问题是:既然两条腿看起来很好,为什么还要用三条腿呢? 这对提供者和客户来说都是更多的工作。为什么其中一个大咖不出手,去掉3条腿?

  • OAuth2.0有多个工作流。关于这两个问题,我有几个问题。 null 这两种方法在安全性方面有什么不同?哪一个更安全,为什么? 当服务器可以直接发出访问令牌时,我看不出为什么在一个工作流中添加额外的步骤(令牌的交换授权代码)。 不同的网站说,授权码流是在客户端应用程序可以保持凭据安全的情况下使用的。为什么?

  • 问题内容: 我有种预感docker可以极大地改善我的webdev工作流程- 但我还没有设法解决如何将docker添加到堆栈中的问题。 基本软件堆栈如下所示: 软件 提供自定义LAMP堆栈的Docker映像 Apache与几个模块 MySQL数据库 的PHP 一些CMS,例如Silverstripe GIT 工作流程 我可以想象工作流程看起来如下所示: 发展历程 编写一个定义满足上述要求的LAMP容

  • 我正在尝试使用隐式、密码和授权流使用Spring OAuth 2设置一个项目。 当我使用相同的令牌endpoint进行隐式验证和其他两种验证时,出现了我的问题,密码和授权需要基本的身份验证来进行客户端验证,而隐式验证不验证客户端机密,我想使用更加密的登录/密码身份验证来进行用户授权。 因此,根据配置,一个或两个流可以工作。拥有两个endpoint似乎是最简单的解决方案,但我找不到如何实现这一点。