【发布时间】:2011-11-23 06:47:26
【问题描述】:
我不知道我是否只是有某种盲点或什么,但我已经多次阅读 OAuth 2 规范并仔细阅读邮件列表档案,但我还没有找到一个很好的解释为什么已经开发了用于获取访问令牌的隐式授予流程。与授权码授予相比,它似乎只是无缘无故地放弃了客户端身份验证。这是如何“针对使用脚本语言在浏览器中实现的客户端进行优化”(引用规范)?
两个流程开始时相同(来源:https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-22):
- 客户端通过将资源所有者的用户代理定向到授权端点来启动流程。
- 授权服务器验证资源所有者(通过用户代理)并确定资源所有者是允许还是拒绝客户端的访问请求。
- 假设资源所有者授予访问权限,授权服务器使用之前提供的重定向 URI(在请求中或在客户端注册期间)将用户代理重定向回客户端。
- 重定向 URI 包含授权码(授权码流)
- 重定向 URI 在 URI 片段中包含访问令牌(隐式流)
这里是分流的地方。在这两种情况下,此时的重定向 URI 都指向客户端托管的某个端点:
- 在授权代码流中,当用户代理使用 URI 中的授权代码访问该端点时,该端点上的代码会交换授权代码及其客户端凭据以获取访问令牌,然后它可以根据需要使用该令牌。例如,它可以将其写入网页上的脚本可以访问的网页。
- 隐式流程完全跳过此客户端身份验证步骤,仅加载带有客户端脚本的网页。 URL 片段有一个可爱的技巧,可以防止访问令牌被过多地传递,但最终结果基本上是相同的:客户端托管的站点提供一个页面,其中包含一些可以获取访问令牌的脚本.
因此我的问题是:跳过客户端身份验证步骤在这里获得了什么?
【问题讨论】:
-
上一条评论中的链接已失效。 Here's an updated one
-
我已经阅读了这里的所有答案,但我仍然不明白不需要私人客户端密码来获取访问令牌如何是安全的。假设 TrustedAppDeveloper 发布了 TrustedPopularApp,让用户使用隐式授权授予它权限(比如使用 Twitter oauth)。如果我是 EvilAppDeveloper,那么是什么阻止我制作一个应用程序,该应用程序在隐式授权请求中将 TrustedPopularAppId 作为 client_id 传递,然后代表用户执行操作(如发送垃圾邮件),现在看起来它们来自 TrustedPopularApp ?
-
@adevine 阻止您场景中的 EvilApp 作为 TrustedPopularApp 向 Twitter 进行身份验证的原因是它无法接收来自 Twitter 的回调,它们将始终被发送到注册时定义的 URI客户编号
标签: oauth user-agent oauth-2.0