我有一个Android应用程序,用户可以通过他们的Facebook帐户使用它。为此,我整合了Facebook登录。但是,我对Facebook的用户注册感到困惑。
当用户登录时,Facebook提供userId,电子邮件和访问令牌。我可以使用它们为我的后端用户创建一个帐户。让我们演示一下这个场景:
用户优先,
1- User logged-in by Facebook.
2- The email is checked by server and returns no such user
3- An account is created by the information from Facebook
4- The user keeps using the app with this account.
用户又来了,
1- User logged-in by Facebook.
2- The email is checked by the server and returns that there exists a user.
就在这里,以下是问题:
1-服务器如何信任来自真正Facebook的请求,以便服务器可以响应应用程序"他可以登录"?当然,我是否应该通过连接到服务器端的Facebook来验证访问令牌?
2-如果没有,如何以非常安全的方式使用Facebook登录注册用户?
类似的问题已经被问到here,但没有答案作为解决方案。
答案 0 :(得分:5)
我已经研究过并最终决定采用以下步骤:
1 - 该应用程序使用Facebook登录并获取访问令牌,电子邮件,名称和userId。
2 - 该应用程序连接到API(服务器端),发送从Facebook收集的信息
3 - 服务器获取访问令牌并使用以下内容对其进行验证:
https://graph.facebook.com/me?access_token={ACCESS-TOKEN}
返回以下内容:
{"name":"{USER-NAME}","id":"{USER-ID}"}
4 - 服务器会检查两个用户ID是否相同。如果是,则验证令牌是否来自Facebook,并且该信息可用于登录/注册。
5 - 服务器检查系统中是否存在电子邮件/用户ID(fb id)。如果没有,则创建用户(触发注册过程)。如果是,则将login设置为success,服务器返回刚生成的access-token和refresh-token的用户信息。
6 - 其他操作都是通过oAuth方式使用这些访问和刷新令牌而不再连接Facebook来执行的。
每次打开应用程序时,AccessToken.getCurrentAccessToken()
都会从Facebook获取访问令牌。如果为null,则用户将看到登录屏幕。如果不是,则将应用上述步骤。
好问题和答案相关本主题:
REST API for website which uses Facebook for authentication
Architecture Design - REST API to support Facebook Login done by Mobile app
关于Facebook本身已有的用户,合并操作和数据结构建议: