9

我正在编写一个允许用户通过 Facebook 注册的手机应用程序。注册后,用户可以通过我将托管的 RESTful Web 服务访问个性化信息。

我见过各种似乎使用类似设置但只向其用户提供 Facebook(或 Twitter)OAuth 身份验证的移动应用程序。我想知道这是怎么做到的?

我认为,为了保护这个 Web 服务,我可以使用基于 HTTPS 的 HTTP Basic 身份验证,并将用户的 Facebook OAuth 访问令牌作为密码。

这安全吗?其他应用程序仅通过 Facebook 注册用户时如何处理安全问题?

4

1 回答 1

11

使用这种格式的应用程序通常执行以下操作:

  1. 该应用程序本身是一个在 FB 注册的应用程序 - 这意味着它有一个应用程序密钥
  2. 当用户使用 FB 注册时 - 真正发生的是他们正在授予应用程序权限,允许它查看他们的数据、发布到他们的墙上等(无论应用程序请求什么权限)
  3. 一旦用户登录 - 应用程序就可以从 FB 请求他们的信息,只要它使用其应用程序密钥对服务进行身份验证。

所以 - 在您的应用程序中,您通常会存储用户的 FB ID,并且当您请求数据(或请求发布到墙上等)时 - 您提交您的应用程序密钥 + 用户的 FB ID,以及您需要提供的任何操作信息。然后,FB 服务会回复您有权查看的数据 - 或执行操作,只要您有权执行它。

在 RESTful 环境中,诀窍是您应该是完全无状态的——这意味着不跟踪任何会话。但是,这很好 - 因为您的应用程序已经有它的应用程序密钥 - 所以您只需要每个请求的用户 FB ID。如果您只是将 ID 插入 cookie 或在客户端管理它,那就很容易了。这个工作怎么样?

当您在 Facebook 注册您的应用程序时,您必须提供一个用于托管该应用程序的 URL。这主要是为了支持跨站点 cookie 和 CORS 请求。换句话说:只要您的请求来自 FB 识别的与您的 App Key 相关联的 URL,FB 就知道您网站上的哪个用户 - 因为它可以完全访问自己的 cookie。

那么这对您尝试使用 FB 来启用您的网站的 OAuth 意味着什么?

它本质上意味着FB成为你的登录系统。您正在断言以下内容:

“只要 FB 说用户就是他们所说的那样——我也相信它。”

因此 - 当用户到达您的站点并单击“使用 Facebook 登录”按钮时 - 您的站点将返回成功或失败。您可以通过查看Facebook 开发者网站,特别是以下参考,获得有关如何实现此功能的更多信息:

  1. Facebook登入
  2. API 参考 > 登录
  3. 登录对话框
  4. 访问令牌和类型
  5. 登录架构

一旦 FB 给你一个指示成功的令牌 - 你可以断言你通过 FB 的 API 获取信息的人就是使用你网站的人。因此 - 例如,如果您将他们的 FB ID 作为主键存储在数据库中 - 您现在可以根据该值从您自己的 API 过滤结果。

往返可能看起来像:

  1. 未经身份验证的用户到达您的站点
  2. 重定向/提供登录按钮以通过 Facebook 进行身份验证
  3. 通过点击 FB Graph API 确定用户现在经过身份验证的身份
  4. 您的 UI 脚本现在将从 Graph 收到的 FB ID 连同其请求提交给您的 API 层
  5. 您的 API 层根据 FB ID(与您的用户记录相关联)过滤数据 - 并返回正确的数据

希望这会有所帮助。如果您有任何问题 - 请在评论中提问,我会尽力添加更多细节。

于 2012-12-24T20:06:14.217 回答