然而,“授权码”流程中,客户端(通常是Web服务器)只会在资源所有者(即用户)授权后获取授权码。 客户端随后使用该授权码调用API,并将client_id、client_secret和授权码一起传递以获取访问令牌。点击此处阅读完整说明。
两个流程都具有完全相同的结果:访问令牌。 然而,“隐式”流程更简单。
问题是:为什么还要使用“授权码”流程,当“隐式”流程似乎已经可以很好地工作? 为什么不仅在Web服务器中使用“隐式”流程? 这对提供者和客户端来说需要更多的工作。
tl;dr: 这是出于安全原因。
OAuth 2.0想要满足以下两个条件:
以下是详细信息:
由于安全原因,只有在浏览器环境下才可能出现隐式流程:
在隐式流程中,访问令牌直接作为哈希片段传递(而不作为URL参数)。哈希片段的一个重要特点是,一旦您跟随包含哈希片段的链接,只有浏览器会意识到哈希片段。浏览器将直接将哈希片段传递到目标网页(重定向URI / 客户端网页)。哈希片段具有以下属性:
这使得可以直接将访问令牌传递给客户端,而无需担心中间服务器拦截。但是这有一个缺点,即仅限于客户端侧,并需要客户端侧运行JavaScript才能使用访问令牌。
隐式流程还存在安全问题,需要进一步的逻辑来解决/避免,例如:
在授权码流程中,不可能直接在URL参数中传递访问令牌,因为URL参数是HTTP请求的一部分,因此任何中间服务器/路由器(可能达到数百个)都可以读取访问令牌,如果您没有使用加密连接(HTTPS),则可能会导致中间人攻击。
理论上,可以直接在URL参数中传递访问令牌,但是授权服务器必须确保重定向URI使用带有TLS加密的HTTPS和“受信任”的SSL证书(通常来自不免费的证书颁发机构),以确保目标服务器是合法的,HTTP请求完全加密。要求所有开发人员购买SSL证书并正确配置其域名上的SSL将是一项巨大的痛苦,并将极大地减慢采用速度。这就是为什么提供一个中介的一次性“授权码”,只有合法的接收者才能进行交换(因为需要客户端密钥),而且该代码对于截获未加密事务的潜在黑客来说是无用的(因为他们不知道客户端密钥)。
你也可以认为隐式流程不够安全,存在潜在攻击向量,例如通过劫持客户网站的IP地址欺骗重定向域名。这是隐式流程仅授予访问令牌(应具有有限使用时间)而永远不会刷新令牌(时间无限制)的原因之一。为了解决这个问题,建议尽可能将您的网页托管在启用HTTPS的服务器上。
https://labs.hybris.com/2012/06/05/oauth2-the-implicit-flow-aka-as-the-client-side-flow
对于谷歌员工:
结论
隐喻
Referer HTTP头)。这是令牌泄漏的方式。
因此,似乎没有办法在重定向URL中传递令牌。这就是为什么需要第二次调用(从认证服务器到客户端(但到哪个URL?)或从客户端到认证服务器(在授权代码流中的第二个调用))。