Design for Facebook authentication in an iOS app that also accesses a secured web service
目标:允许用户在iOS应用程序中使用Facebook进行身份验证,该应用程序需要访问我正在运行的受保护的Web服务。
假设:对于那些选择不使用Facebook登录的用户,有一个本地身份验证(和注册)系统。
细节:
- 假设我们希望为用户提供使用Facebook登录的选项,而不为我们的系统创建单独的帐户/凭证。
- 因为我们支持自己的本机身份验证机制(用户名和密码),所以我们有自己的用户ID,并发出一个身份验证令牌,用于初始凭证验证之后的后续交互。
我很惊讶Facebook的开发人员文档中没有这方面的最佳实践。所有现有的文档要么假设您正在将FB认证构建到一个网站中,要么假设您是一个不需要认证服务的独立移动应用程序。
这是我最初的想法如何设计,但希望验证它是否正确。
我们的服务器使用访问令牌与FB图形API进行对话,以(a)验证令牌并(b)获取该访问令牌的FB用户ID。
例如,我们的服务器会调用https://graph.facebook.com/me/?access_token=xyz,它将返回json对象中的配置文件信息。
假设它是有效的,我们的服务器将从JSON对象中提取用户ID,并检查用户是否已经拥有帐户。如果是这样,我们将向客户机发出我们自己的身份验证票据,以用于该会话。如果用户没有帐户,我们将使用Facebook用户ID创建一个新的帐户,分配我们自己的唯一用户ID并颁发我们的身份验证通知单。
这对我来说似乎是正确的方法,但不确定我是否遗漏了一些非常基础的东西,并且走上了错误的(复杂的)道路。
我自己刚处理过这个问题,这就是咬我的部分:
在第5步中…用户可以在你那里注册一个完全独立于他们的Facebook ID的帐户,对吗?然后其他时候他们用Facebook登录……你刚刚为他们创建了第二个账户,却丢失了第一个账户。
需要有一种方法登录到您的Web服务,然后登录到Facebook,并捕获Facebook ID和本地帐户之间的关联。
除此之外,你的计划听起来很可靠。
更新:Facebook在这里添加了一个文档,概述了这种情况。
如facebook所述,使用https将认证令牌传输到您的服务器
Sharing of Access Tokens
Our Data Policies explicitly prohibit any sharing of an Access Token
for your app with any other app. However, we do allow developers to
share Tokens between a native implementation and a server
implementation of the same App (ie. using the same App ID) as long as
the transfer takes place using HTTPS.
我可以从这个策略中看到的一个问题是,有人可以给你一个为不同的Facebook应用程序获得的访问令牌。据我所知,无法验证访问令牌是否适用于您的应用程序,因此您只需继续使用它。
不过,这听起来并不十分有害。一般来说,人们/应用程序试图保护访问令牌,而不是共享它们。
其中一个可能的漏洞是,有人创建自己的网站或移动应用程序,为他们的用户获取访问令牌,并尝试使用您的API对其进行身份验证。如果成功(用户在您的站点中有Facebook帐户),恶意站点将能够使用您的API模拟用户。
这是一个有点长的镜头,但我认为它可以工作。
编辑:看起来有一种方法可以验证访问令牌。有关从用户访问令牌获取应用程序ID的问题,请参见@daaniel给出的答案(或验证源应用程序中的令牌)。
你的解决方案完全有效。
也许还有另一种选择:为什么不从最初的社交服务请求中获取客户的电子邮件并发送到您的Web服务?Web服务可以只存储电子邮件,也可以存储社交网站。我了解您的Web服务将无法验证电子邮件的来源,但您的Web服务和客户之间是否存在高度信任关系?如果有的话,似乎你可以依靠来自正确地点的电子邮件。有人请告诉我,我错过了什么明显的东西,使基于电子邮件的方法愚蠢…