在iOS应用程序中设计Facebook身份验证,该应用程序也可访问安全的Web服务

TMC*_*TMC 397 facebook facebook-graph-api ios4 ios

目标: 允许用户使用Facebook进行身份验证,进入需要访问我正在运行的受保护Web服务的iOS应用程序.

假设: 对于那些选择不使用Facebook登录的用户,有一个原生身份验证(和注册)系统.

细节:

  • 假设我们希望为用户提供登录Facebook的选项,而无需为我们的系统创建单独的帐户/凭证.
  • 因为我们支持我们自己的本机身份验证机制(用户名和密码),所以我们拥有自己的用户ID,并在初始凭据验证后发出用于后续交互的身份验证令牌.

我很惊讶Facebook在他们的开发者文档中没有这方面的最佳实践.所有现有文档要么假设您正在构建一个网站的FB auth,要么是一个没有需要身份验证的服务的独立移动应用程序.

这是我对如何设计这个问题的初步想法,但是想要验证它是否正确.

  1. 客户端弹出Facebook iOS登录
  2. UI用户使用Facebook凭据登录并获取访问令牌
  3. iOS App将访问令牌传递给我们的服务器
  4. 我们的服务器使用访问令牌与FB图形API进行通信,以(a)验证令牌和(b)获取该访问令牌的FB用户ID.

    例如,我们的服务器将调用https://graph.facebook.com/me/?access_token=XYZ,它将返回JSON对象中的配置文件信息

  5. 假设它有效,我们的服务器从JSON对象中提取用户ID并检查用户是否已经拥有一个帐户.如果是这样,我们会向客户端发出我们自己的身份验证票据以用于该会话.如果用户没有帐户,我们使用Facebook用户ID创建一个新帐户,分配我们自己的唯一用户ID并发出我们的身份验证票.

  6. 然后,客户端在后续需要身份验证的交互上传回auth票证.

这对我来说似乎是正确的方法,但不确定我是否遗漏了一些疯狂的基本内容并走错了(复杂的)路径.

Dan*_*Ray 77

我自己刚刚处理过这个问题,这就是我的一部分:

在您的第5步中...用户可以注册一个与您的Facebook ID完全分开的帐户,对吧?然后在其他时间他们用Facebook登录....你刚刚创建了第二个帐户并丢失了他们的第一个帐户.

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

除此之外,你的计划听起来很稳固.

更新:Facebook在此处添加了一个概述此类情景的文档

  • 是的,我已经考虑过了,你就是这样.我们计划合并帐户,如果它是相同的电子邮件地址,如果没有,我们将创建另一种方式来合并它们. (7认同)
  • @TimLeung - 我的理解是,一个访问令牌嵌入应用程序ID,并且,你不能有一个访问令牌无烤到它的应用程序ID. (7认同)

zoo*_*ypt 28

如Facebook所述,使用https将身份验证令牌传输到您的服务器

共享访问令牌

我们的数据政策明确禁止与任何其他应用共享您的应用的访问令牌.但是,我们允许开发人员在本机实现和同一App的服务器实现之间共享令牌(即使用相同的App ID),只要使用HTTPS进行传输即可.


iva*_*ant 15

我可以通过这种策略看到的一个问题是,有人可以为您提供为不同的Facebook应用获取的访问令牌.据我所知,没有办法验证访问令牌是否适用于您的应用程序,因此您将继续使用它.

但这听起来并不是很有害.通常,人/应用程序会尝试保护访问令牌,而不是共享它们.

一种可能的利用方式是,为某人创建自己的网站或移动应用程序,为其用户获取访问权限,并尝试使用您的API对其进行身份验证.如果此操作成功(用户在您的站点中拥有Facebook帐户),则恶意站点将能够使用您的API模拟用户.

这是一个很长的镜头,但我认为它可以工作.

编辑:看起来有一种方法可以验证访问令牌.请参阅@Daaniel关于问题的答案从用户访问令牌获取应用程序ID(或验证源应用程序是否有令牌).

  • 您可以通过`https://graph.facebook.com/app/?access_token= [user_access_token]`来验证是否为您的应用生成了令牌,该令牌返回应用ID,然后比较应用ID (2认同)