在iOS应用程序中deviseFacebook身份validation,同时访问安全的Web服务

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

假设:对于那些select不使用Facebooklogin的用户,有一个本地authentication(和注册)系统。

细节:

  • 假设我们想为用户提供一个select,使用Facebooklogin而不需要为我们的系统创build一个单独的账户/凭证。
  • 因为我们支持自己的本地身份validation机制(用户名和密码),所以我们拥有自己的用户ID,并在初始凭证validation之后颁发用于后续交互的身份validation令牌。

我很惊讶Facebook在开发者文档中没有这方面的最佳实践。 所有现有的文档都假设您正在将FB身份validation构build到网站中,或者是没有需要身份validation的服务的独立移动应用程序。

这里是我如何devise这个devise的初步想法,但是想validation它是否正确。

  1. 客户端popupFacebook的iOSlogin
  2. 用户界面用户使用Facebook凭据login并获取访问令牌
  3. iOS App将访问令牌传递给我们的服务器
  4. 我们的服务器使用访问令牌与FBgraphicsAPI进行通信,以(a)validation令牌和(b)获得该访问令牌的FB用户ID。

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

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

  6. 然后,客户端将身份validation单传递给需要身份validation的后续交互。

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

我只是自己处理这个,这是我的一部分:

在你的第5步…用户可能注册一个帐户与你完全独立于他们的Facebook ID,对不对? 然后,他们再次loginFacebook的时候… …而你刚刚创build了他们的第二个帐户,并失去了他们的第一个。

需要有一种方式login到您的Web服务,然后login到Facebook,并捕获Facebook的身份证和本地帐户之间的关联。

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

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

共享访问令牌

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

我可以看到这个策略的一个问题是,有人可以给你一个访问令牌获得不同的Facebook应用程序。 据我所知,无法validation访问令牌是否适用于您的应用程序,因此您可以继续使用它。

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

一个可能的利用这将是,有人创build自己的网站或移动应用程序,获取用户的访问令牌,并尝试使用您的API进行身份validation。 如果成功(用户在您的网站上有一个Facebook帐户),恶意网站将能够使用您的API模拟用户。

这是一个远射,但我认为它可以工作。

编辑:它看起来像有一种方法来validation访问令牌毕竟。 问题请参见@Daaniel的答案从用户访问令牌获取应用程序ID(或validation源应用程序是否有令牌) 。

你的解决scheme完全可行

也许是另一种select:为什么不从最初的社交服务请求中获取客户端上的电子邮件并发送到您的Web服务? Web服务可以存储电子邮件,也可以是社交提供者。 我知道您的Web服务将无法validation电子邮件来自哪里,但您的Web服务与客户端之间没有高度信任关系? 如果有的话,似乎你可以依靠来自正确的地方的电子邮件。 有人请让我知道我错过了什么明显的东西,使基于电子邮件的方法愚蠢的…