通过“隐式”流,在资源所有者(即用户)给予访问权之后,客户端(可能是浏览器)将获得一个访问令牌。
然而,对于“授权代码”流,客户端(通常是web服务器)仅在资源所有者(即用户)给予访问权之后才获得授权代码。使用该授权代码,客户机然后对API进行另一次调用,传递client_id和client_secret以及授权代码,以获得访问令牌。这里都有很好的描述。
这两个流具有完全相同的结果:访问令牌。不过,“隐性”流动要简单得多。
问题是:为什么要费心于“授权码”流量,当“隐性”流量接缝就好了?为什么不对WebServer也使用“隐式”呢?
TL;DR:这都是因为安全原因。
OAuth 2.0希望满足以下两个标准:
详情如下:
由于安全原因,隐式流仅在浏览器环境中是可能的:
在隐式流中,访问令牌直接作为散列片段(而不是URL参数)传递。关于哈希片段的一个重要的事情是,一旦您跟踪包含哈希片段的链接,只有浏览器才知道该哈希片段。浏览器将把散列片段直接传递到目标网页(重定向URI/客户端的网页)。哈希片段具有以下属性:
这使得可以将访问令牌直接传递给客户端,而不会有被中间服务器截获的风险。这有一个警告,即只能在客户端使用,并且需要运行客户端的javascript来使用访问令牌。
隐式流还存在需要进一步的逻辑来解决/避免的安全问题,例如:
在授权代码流中,不可能在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似乎是最简单的解决方案,但我找不到如何实现这一点。