我正在编写一个手机应用程序,允许用户通过 Facebook 注册。注册后,用户就可以通过我将托管的 RESTful Web 服务访问个性化信息。
我见过各种移动应用程序似乎使用类似的设置,但仅向用户提供 Facebook(或 Twitter)OAuth 身份验证。我想知道这是如何做到的?
我认为,为了保护此 Web 服务的安全,我可以使用基于 HTTPS 的 HTTP 基本身份验证,并将用户的 Facebook OAuth 访问 token 作为密码。
这安全吗?其他应用程序仅通过 Facebook 注册用户时如何处理安全性?
最佳答案
使用这种格式的应用程序通常会执行以下操作:
- 应用程序本身是一个在 FB 上注册的应用程序 - 这意味着它有一个应用程序 key
- 当用户使用 FB 注册时 - 真正发生的是他们向应用授予权限,允许其查看他们的数据、发布到他们的信息墙上等(无论应用请求什么权限)
- 用户登录后 - 只要使用其应用 key 通过服务进行身份验证,应用程序就可以从 FB 请求他们的信息。
因此 - 在您的应用程序中,您通常会存储用户的 FB ID,当您请求数据(或请求发布到墙上等)时 - 您提交您的应用程序 key + 用户的 FB ID ,以及您需要提供的任何操作信息。然后,FB 服务会回复您有权查看的数据 - 或执行操作,只要您有权执行即可。
在 RESTful 环境中,诀窍在于您应该是完全无状态的 - 这意味着不会跟踪任何 session 。不过,这很好 - 因为您的应用程序已经有其应用程序 key - 所以您需要的只是每个请求的用户 FB ID。如果您只需将 ID 插入 cookie 中,或者在客户端进行管理,就很简单了。这个工作怎么样?
当您向 Facebook 注册您的应用程序时,您必须提供一个用于托管该应用程序的 URL。这主要是为了支持跨站点 cookie 和 CORS 请求。换句话说:只要您的请求来自 FB 识别的与您的应用程序 key 关联的 URL,FB 就知道哪个用户在您的网站上 - 因为它可以完全访问自己的 cookie。
那么这对您尝试使用 FB OAuth 启用您的网站意味着什么?
这本质上意味着 FB 成为您的登录系统。您断言以下内容:
"As long as FB says the user is who they say they are - I trust it, too."
因此,当用户到达您的网站并单击“使用 Facebook 登录”按钮时,您的网站将返回成功或失败的信息。您可以获取有关如何实现这一点的更多信息,具体来说,通过查看 Facebook Developers网站,特别是以下引用文献:
一旦 FB 给您返回一个指示成功的 token - 您就可以断言通过 FB 的 API 向您返回信息的人就是使用您网站的人。因此,例如,如果您将他们的 FB ID 作为主键存储在数据库中,您现在可以根据该值过滤您自己的 API 的结果。
往返可能类似于:
- 未经身份验证的用户访问您的网站
- 重定向/提供登录按钮以通过 Facebook 进行身份验证
- 通过访问 FB Graph API 确定用户现已经过身份验证的身份
- 您的 UI 脚本现在将从 Graph 收到的 FB ID 及其请求提交给您的 API 层
- 您的 API 层根据 FB ID(与您的用户记录关联)过滤数据 - 并返回正确的数据
希望这对您有帮助。如果您有疑问 - 请在评论中提问,我会尽力添加更多详细信息。
关于web-services - 我可以使用 Facebook OAuth 来保护我的 RESTful Web 服务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11401108/