在iOS应用程序中设计Facebook身份验证,同时访问安全的web服务

< >强目标: 允许用户通过Facebook认证进入iOS应用程序,该应用程序需要访问我正在运行的受保护的web服务

< >强假设: 对于那些选择不使用Facebook登录的用户,有一个本地认证(和注册)系统

细节:

  • 假设我们希望为用户提供一种选择,让用户无需为我们的系统创建单独的帐户/凭据就可以登录Facebook。
  • 因为我们支持自己的本地身份验证机制(用户名和密码),所以我们有自己的用户id,并发出一个身份验证令牌,该令牌在初始凭证验证之后用于后续交互。

我很惊讶Facebook在他们的开发者文档中没有这方面的最佳实践。所有现有的文档都假设你正在将facebook认证构建到一个网站中,或者是一个不需要认证服务的独立移动应用程序。

以下是我对这将如何设计的最初想法,但希望验证它是否正确。

  1. 客户端弹出Facebook iOS登录
  2. 用户使用Facebook凭证登录并获得访问令牌
  3. iOS应用程序将访问令牌传递给我们的服务器
  4. 我们的服务器使用访问令牌与FB图形API对话,以(a)验证令牌,(b)获取该访问令牌的FB用户ID。

    例如,我们的服务器将调用https://graph.facebook.com/me/?access_token=XYZ,它将以JSON对象

    的形式返回配置文件信息
  5. 假设它是有效的,我们的服务器从JSON对象中提取User ID,并检查用户是否已经拥有帐户。如果是这样,我们就向客户端发出我们自己的认证票据,以用于该会话。如果用户没有帐户,我们创建一个新的Facebook用户ID,分配我们自己唯一的用户ID,并发出我们的认证票。

  6. 客户端然后在需要身份验证的后续交互中传递身份验证票据。

这对我来说似乎是正确的方法,但不确定我是否错过了一些疯狂的基本内容,走上了错误的(复杂的)道路。

49557 次浏览

我自己也刚处理过,这是让我很难受的部分:

在你的第五步中…用户可以在你这里注册一个完全独立于他们的Facebook账号,对吧?然后在其他时间登录Facebook....你刚给他们创建了第二个账户,却把第一个账户弄丢了。

需要有一种方法来登录到您的web服务,然后登录到facebook,并捕获facebook ID和本地帐户之间的关联。

除此之外,你的计划听起来很可靠。

更新: Facebook已经添加了一个文档概述这样的场景在这里

我可以看到这个策略的一个问题是,有人可以给你一个不同的facebook应用程序的访问令牌。据我所知,没有办法验证访问令牌是否适合你的应用程序,所以你只是继续使用它。

不过,这听起来并不是很有害。一般来说,人们/应用程序试图保护访问令牌,而不是共享它们。

一个可能的利用是,让某人创建他们自己的网站或移动应用程序,为他们的用户获取访问令牌,并尝试使用您的API对他们进行身份验证。如果此操作成功(用户在您的站点中拥有facebook帐户),恶意站点将能够使用您的API冒充该用户。

虽然可能性不大,但我认为可行。

编辑:看起来有一种方法可以验证访问令牌。请看@Daaniel对问题从用户访问令牌获取应用程序id(或验证源应用程序的令牌)的回答。

使用https传输认证令牌到您的服务器,如Facebook所述

共享访问令牌

我们的数据政策明确禁止任何访问令牌共享 但是,我们允许开发者这样做 在本机实现和服务器之间共享令牌 实现相同的应用程序(即。使用相同的App ID),只要 传输是使用HTTPS进行的

你的解决办法完全有效。

也许还有另一种选择:为什么不直接从客户端获得最初的社会服务请求的电子邮件并发送到您的web服务?web服务可以只存储电子邮件,也可以存储一个social_provider。我知道你们的网络服务将无法验证电子邮件的来源,但你们的网络服务和客户之间不是有高度信任的关系吗?如果有的话,似乎你可以相信这封邮件来自正确的地方。请有人告诉我,我错过了什么明显的东西,让基于电子邮件的方法变得愚蠢……