如果我理解正确,要从我的桌面应用程序进行 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 步骤组成:
- 用户身份验证,如果资源所有者未登录 Facebook,将显示一个对话框,询问 Facebook 凭据。如果资源所有者已登录,会话将使用 Facebook 服务器上的 cookie 进行身份验证。安全 - CHECK V!
- 应用授权,如果资源所有者尚未授予应用权限,则权限对话框将要求资源所有者授予应用权限,如果资源所有者先前已授予所有需要的权限,则不会显示权限对话框。安全 - 检查 V!
- 应用程序身份验证 - 现在,这是它变得棘手的地方。该指南说:“通过验证 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 有什么区别吗?
干杯!