OAuth 2中隐式授权类型的目的是什么?

289
我不知道是否只是我有某种盲点,但我已经多次阅读了OAuth 2规范并查看了邮件列表归档,但我尚未找到一个好的解释为什么开发了Implicit Grant flow以获取访问令牌。与Authorization Code Grant相比,它似乎只是放弃了客户端身份验证,没有非常引人注目的原因。这个“针对在使用脚本语言实现的浏览器中的客户端进行优化”(引用规范)是如何实现的呢?
这两种流程都是从相同的起点开始的(来源:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-22):
1. 客户端通过将资源所有者的用户代理重定向到授权终端点来启动流程。 2. 授权服务器通过用户代理对资源所有者进行身份验证,并确定资源所有者是否授予或拒绝客户端访问请求。 3. 假设资源所有者授予访问权限,则授权服务器使用之前提供的重定向URI(在请求或客户端注册期间)将用户代理重定向回客户端。
重定向URI分别包含授权代码(Authorization code flow)和访问令牌(Implicit flow)。
这里是流程分叉的地方。在这两种情况下,此时重定向URI指向客户端托管的某个端点:
1. 在Authorization code flow中,当用户代理使用URI中的Authorization code命中该端点时,该端点上的代码将授权代码与其客户端凭据交换以获取访问令牌,然后可以根据需要使用它。例如,它可以将其写入页面,页面上的脚本可以访问它。 2. Implicit flow完全跳过了此客户端身份验证步骤,并仅加载带有客户端脚本的Web页面。这里有一个URL片段的巧妙技巧,使访问令牌不会被传递太多次,但最终结果基本相同:客户端托管的站点提供了一个带有一些脚本的页面,可以抓取访问令牌。因此我的问题是:跳过客户端认证步骤有什么收获?

请查看此链接:http://www.ibm.com/developerworks/wikis/display/tivolifederatedidentitymanager/Example+of+running+an+implicit+grant+OAuth+2.0+flow - Håvard Geithus
5
之前的评论中的链接已经失效。这是更新后的链接 - AndrewR
3
我已经阅读了所有的回答,但我仍然不明白为什么在获取访问令牌时不需要私有客户端密码就能够确保安全。比如说TrustedAppDeveloper发布了TrustedPopularApp,它允许用户使用Twitter oauth授权来授予权限。如果我是EvilAppDeveloper,那么有什么方法可以阻止我制作一个应用程序,在隐式授权请求中将TrustedPopularAppId作为client_id传递,然后以用户的身份执行操作(如垃圾邮件),这些操作现在看起来像是来自TrustedPopularApp? - adevine
我和adevine一样也很好奇。但是,大多数需要隐式授权请求的应用程序不需要更多的身份验证,因为它们都是获取操作。 - Mave
15
在您的情境中,什么会阻止邪恶应用程序作为受信任的热门应用程序进行 Twitter 认证,是因为它无法接收来自 Twitter 的回调,这些回调始终会发送到注册客户端 ID 时定义的 URI。 - Ivan
1
可能是这两个工作流有什么区别?何时使用授权代码流程?的重复问题。 - Michael Freidgeim
13个回答

2
隐式授权允许使用GET授权终端点获取令牌。这意味着授权服务器不必支持CORS。
如果这不是一个问题,并且与授权服务器的其他问题无关(例如,某些原因下刷新令牌不是可选项),则根据最近的行业趋势和至少这个(当前的)官方草案实例,授权代码流是首选的,即使对于公共客户端也是如此。
历史上还有其他实现隐式流的原因,但目前似乎它们被授权代码授予提供的安全优势所抵消,包括:
  • 为机密客户端提供在后通道上传递和使用令牌的选项
  • 不会将令牌暴露在浏览器历史记录中,适用于公共客户端
  • 在发出令牌之前终止未经授权的流程-使用PKCE,适用于“所有类型的OAuth客户端”

1
我刚刚看到了一篇关于OAuth 2.0的文章。作者指出,Implicit流程的原因是JS应用程序在请求方面受到了很大限制:
引用: 如果你想知道为什么OAuth 2.0中包含了implicit类型,答案很简单:同源策略。当时,前端应用程序不允许使用代码向不同的主机发送请求以获取访问令牌。今天我们有CORS(跨域资源共享)。

https://medium.com/securing/what-is-going-on-with-oauth-2-0-and-why-you-should-not-use-it-for-authentication-5f47597b2611


0

授权码

  • 更加安全;
  • 最常用的方式;
  • 客户端应用程序(在OAuth的术语中)需要有一个服务器(后端)组件;
  • 应该优先考虑使用。

隐式授权

  • 当“授权码”不可行时使用,即客户端没有服务器时;
  • 这是一种安全上的妥协,请确保您了解风险。

隐式授权流程相对简单。授权服务器会将访问令牌直接发送到用户的浏览器(假设客户端是一个Web应用程序),通过将其附加到重定向URL

授权码流程中,授权服务器仅会发送一个临时的非常短暂的授权码,然后由客户端的后端使用该代码来获取实际的访问和刷新令牌。访问令牌和刷新令牌都不会发送到用户代理;它们的整个生命周期都被限制在授权服务器客户端的后端之间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接