4

如果我理解正确,要从我的桌面应用程序进行 API 调用(让我们从现在开始在 OAuth2 标准中的“客户端”上调用它)我需要获取一个 access_token,它是一个结合了应用程序 ID 和用户的标识符,我想访问谁的数据,id(“资源所有者”)。

遵循身份验证指南(developers.facebook.com/docs/authentication/)上的客户端流程,我了解我需要向 h**ps://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http 发送请求://example.com&response_type=token。结果,页面将被重定向到 h**p://example.com/#access_token=XXX。如果客户端是纯桌面应用,那么redirect_uri可以是h**p://www.facebook.com/connect/login_success.html。由于客户端拥有 Web 控件,因此可以轻松地从重定向地址中提取 access_token。

客户端流程由 3 个 OAuth 步骤组成:

  1. 用户身份验证,如果资源所有者未登录 Facebook,将显示一个对话框,询问 Facebook 凭据。如果资源所有者已登录,会话将使用 Facebook 服务器上的 cookie 进行身份验证。安全 - CHECK V!
  2. 应用授权,如果资源所有者尚未授予应用权限,则权限对话框将要求资源所有者授予应用权限,如果资源所有者先前已授予所有需要的权限,则不会显示权限对话框。安全 - 检查 V!
  3. 应用程序身份验证 - 现在,这是它变得棘手的地方。该指南说:“通过验证 redirect_uri 与开发人员应用程序中配置的站点 URL 位于同一域中来处理应用程序身份验证”。安全 - 在我看来 -失败

为什么我认为最后一步是安全失败?首先,app id 和redirect_uri 都是任何人都可以获得的公开信息。其次,redirect_uri 可以是 h**p://www.facebook.com/connect/login_success.html。

让我们看看下面的场景。桌面应用程序 EVE 向用户显示了一个 Web 控件,用户在其中登录 facebook 并授予 EVE 一些基本权限。资源所有者没有理由怀疑任何事情。接下来,EVE 隐藏 web 控件,并尝试在其上加载 h**ps://www.facebook.com/dialog/oauth?client_id= OTHER_APP_ID &redirect_uri=http://www.facebook.com/connect/login_success .html&response_type=令牌。该应用程序可以尝试使用最流行的 Facebook 应用程序应用程序 ID 加载此 url。如果用户之前授权了 OTHER_APP,应用程序将收到成功消息,因为登录对话框和权限对话框都不会显示。这将给 EVE 一个 access_token 来访问资源所有者授予 OTHER_APP 而不是 EVE 的资源所有者的所有资源。

那么,这是一个安全漏洞吗?我错过了以下内容吗?

(更新)

显然,在桌面应用程序的情况下,安全问题是无关紧要的,因为应用程序已经有了用户名和 facebook 会话,甚至用户名和密码,它可以对用户帐户做任何事情。

(更新) 对于在 Web 浏览器中运行的 JavaScript 应用程序,redirect_uri 确实有效!(请参阅 hnrt 的回答和评论)。

当前问题: 唯一剩下的谜团是客户端身份验证如何在 iPhone 和 Android 应用程序上工作?安全性是否与使用桌面应用程序时的安全性相似?越狱的 iPhone 或 root 的 Android 有什么区别吗?

干杯!

4

1 回答 1

1

如果我理解正确,您的场景将要求用户已经使用 EVE 可以用来与 Facebook 交谈的相同 Web 控件对其他应用程序进行身份验证。如果是这种情况,那么已经存在更大的安全问题 :) EVE 可能会劫持整个会话及其所有身份验证令牌。

[更新] 关于 Javascript 应用程序,同源策略阻止 EVE 访问/dialog/oauth?client_id=OTHER_APP请求的回复。访问数据的唯一方法是等待redirect_uri并解析重定向的请求。在这里,“站点 url”-保护开始了。

我不确定 iPhone 和 Android 应用程序是如何工作的,但如果他们的 Web 控件允许访问其他应用程序的身份验证数据 (=cookies),我会感到非常惊讶。

于 2011-02-01T22:43:35.207 回答