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