目标: 允许用户使用Facebook进行身份验证,进入需要访问我正在运行的受保护Web服务的iOS应用程序。
假设: 对于那些选择不使用Facebook进行登录的用户,有一个原生身份验证(和注册)系统。
详细信息:
我很惊讶Facebook在他们的开发者文档中没有这方面的最佳实践。所有现有文档要么假设您正在构建一个网站的FB auth,要么是一个没有需要身份验证的服务的独立移动应用程序。
以下是我对如何设计这个问题的初步想法,但希望验证它是否正确。
我们的服务器使用访问令牌与FB图形API进行通信,以(a)验证令牌和(b)获取该访问令牌的FB用户ID。
e.g。我们的服务器将调用https://graph.facebook.com/me/?access_token=XYZ,它将返回JSON对象中的配置文件信息
假设它有效,我们的服务器从JSON对象中提取用户ID并检查用户是否已有帐户。如果是这样,我们会向客户端发出我们自己的身份验证票据以用于该会话。如果用户没有帐户,我们会使用Facebook用户ID创建一个新帐户,分配我们自己的唯一用户ID并发出我们的身份证明。
对我来说,这似乎是正确的方法,但不确定我是否遗漏了一些疯狂的基本内容并走错了(复杂的)路径。
答案 0 :(得分:76)
我自己刚刚处理过这个问题,而这就是我的一部分:
在您的第5步中...用户可以注册一个与您的Facebook ID完全分开的帐户,对吧?然后在其他时间他们用Facebook登录....你刚刚创建了第二个帐户并丢失了他们的第一个帐户。
需要有一种方法登录到您的网络服务,然后登录到Facebook,并捕获Facebook ID和本地帐户之间的关联。
除此之外,你的计划听起来还不错。
更新:Facebook添加了一个概述此类情景的文档HERE
答案 1 :(得分:28)
使用https将身份验证令牌传送到您的服务器,如Facebook所述
共享访问令牌
我们的数据政策明确禁止任何共享访问令牌 适用于任何其他应用的应用。但是,我们确实允许开发人员 在本机实现和服务器之间共享令牌 只要实现相同的应用程序(即使用相同的应用程序ID) 传输使用HTTPS进行。
答案 2 :(得分:14)
我可以通过此策略看到的一个问题是,有人可以为您提供为其他Facebook应用获取的访问令牌。据我所知,没有办法验证访问令牌是否适用于您的应用程序,因此您将继续使用它。
但是,这听起来并不是很有害。通常,人/应用程序会尝试保护访问令牌,而不是共享它们。对此有一种可能的利用方式是,为某人创建自己的网站或移动应用,为其用户获取访问令牌并尝试使用您的API对其进行身份验证。如果此操作成功(用户在您的站点中拥有Facebook帐户),则恶意站点将能够使用您的API模拟用户。
这有点远,但我认为它可行。
编辑:看起来有一种方法可以验证访问令牌。请在问题Get application id from user access token (or verify the source application for a token)上查看@Daaniel的答案。
答案 3 :(得分:4)
你的解决方案完全有效。
也许另类:为什么不从最初的社交服务请求获取客户端上的电子邮件并发送到您的Web服务? Web服务可以只存储电子邮件,也可以是social_provider。我了解您的网络服务无法验证电子邮件的来源,但您的网络服务与客户之间是否存在高度信任关系?如果有,似乎你可以依赖来自正确的地方的电子邮件。有人请让我知道我错过了哪些显而易见的事情让基于电子邮件的方法变得愚蠢......