2011-01-07 63 views
359

目标: 允许用户使用Facebook进行身份验证,进入需要访问我正在运行的受保护Web服务的iOS应用程序。在iOS应用程序中进行Facebook身份验证的设计也可以访问安全的Web服务

假设: 目前已具备为那些选择不使用Facebook的标志使用本地认证(登记)制度

详情:

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

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

这是我的初步想法,这将如何设计,但要验证它是否正确。

  1. 客户端弹出的Facebook的iOS登录
  2. UI用户登录与Facebook的证书和获得访问令牌
  3. iOS应用程序通过访问令牌我们的服务器FB图形API使用访问
  4. 我们的服务器会谈令牌(a)验证令牌和(b)获取该访问令牌的FB用户ID。

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

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

  6. 然后,客户端将身份验证信息传递给需要身份验证的后续交互。

这似乎是对我来说正确的方法,但不知道如果我失去了疯狂的基本和错误的(复杂的)路径。

+0

这是如何解决?我正在考虑传递访问令牌,并在服务器上启动用户。似乎学术,但我问。 – 2011-04-22 17:43:41

+0

这是我的实现使用rails和设计: http://stackoverflow.com/questions/7232490/how-to-use-http-authentication-in-devise-with-an-optional-omniauth-token-as- – Matt 2011-12-20 06:46:14

+0

为什么不传递整个auth_hash,而不必两次调用FB API(一个来自iOS设备,一个来自服务器)? – bsiddiqui 2013-03-11 18:10:02

回答

66

我刚刚处理了这个自己,这里有一个咬了我的一部分:

在你的第5步......这有可能使用户的账号与你完全从他们的Facebook ID单独注册,右?然后,他们再次登录Facebook ......并且您刚创建了第二个帐户并丢失了第一个帐户。

有需要在你的web服务,以记录的方式,然后登录到Facebook,并捕获了Facebook ID和本地帐户之间的关联。

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

11

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

虽然这听起来不太有害。通常,人/应用会尝试保护访问令牌,而不是共享它们。这

一个可能的攻击将是,有人来创建自己的网站或移动应用程序,获得访问令牌为他们的用户,并试图对其进行身份验证,使用API​​。如果成功(用户在您的网站上有一个Facebook帐户),恶意网站将能够使用您的API模拟用户。

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

编辑:看起来好像有一种方法来验证访问令牌。请参阅@Daaniel在Get application id from user access token (or verify the source application for a token)问题上的答案。

27

使用HTTPS的身份验证令牌传递到你的服务器,如Facebook的规定

访问令牌的共享

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

3

您的解决方案完全适用。

也许替代:为什么不干脆从最初的社会化服务的要求在客户端上的电子邮件,然后发送到你的Web服务? Web服务可以存储电子邮件,也可以是社交供应商。我知道您的Web服务将无法验证电子邮件的来源,但您的Web服务与客户之间没有高度信任关系?如果有的话,似乎你可以依靠来自正确的地方的电子邮件。有人请让我知道我错过了什么明显的事情,使基于电子邮件的方法愚蠢......

相关问题