Android最佳实践:使用Facebook或Google登录验证用户。

19

我正在开发一款应用程序,其中包括Facebook和Google的登录选项以及传统的电子邮件+密码登录。我在考虑使用第三方API进行登录时遇到了几个问题:

1. 由于一个用户可能会使用他的Facebook帐户登录,然后决定退出并使用他的Google帐户登录,所以用户应该通过他的电子邮件地址来识别。因此,每当他使用不同的帐户登录时,系统会在数据库中搜索电子邮件地址,并且如果找到,则将此新登录附加到先前创建的帐户上。请确认这一点。

2. 如果用户使用Facebook登录,则可以获取accessToken、userId、user e-mail等信息。那么最安全的认证用户的方法是什么?我应该直接将他的Facebook accessToken和e-mail地址发送到服务器吗?服务器应该检查accessToken是否真的存在于Facebook中吗?生成应用程序私有访问令牌的最佳和最安全方式是什么?我听说过MD5哈希...那么我应该仅使用服务器端生成的这个新访问令牌进行API调用,而不使用任何Facebook凭据吗?或者应该使用Facebook凭据,并将它们保存在服务器/客户端端吗? 我将使用Java App-engine作为我的应用程序服务器端。

3. 如果用户在Facebook上删除了他的帐户,该怎么办?应用程序如何知道这一点?如果无论如何都知道,该怎么处理该帐户?

  1. 我应该定期检查访问令牌是否仍然有效吗?为什么、如何和多久检查一次?

我不确定我是否在正确的地方提问。如果我错了,请将我重定向到正确的方式,也许有关这些最佳实践的链接?到目前为止,我没有找到任何能回答所有问题的东西。我猜这既与编码有关,也与安全有关。 感谢你们所有的技巧和提示。


这只是一个不太可能的想法,但几天前谷歌将身份工具包添加到他们的googlesamples GitHub项目中; https://github.com/googlesamples/identity-toolkit-android 。而且身份工具包的主网页似乎与您所询问的类似问题有些关联;https://developers.google.com/identity-toolkit/。虽然这方面的知识我了解甚少,但你的问题让我想起了这个东西。 - harism
谢谢!能帮我回答一些问题吗? - vandus
2个回答

11

经过一些阅读和询问,我得出了以下结论:

1. 如果要使用用户的Facebook或Google账户进行注册,您需要调用API获取电子邮件地址(如果在Android上使用Google的AccountManager更容易),将其发送到您的服务器以保存电子邮件地址,并关联一个用户ID生成其自己的访问代码。访问代码将被发送回客户端应用程序以进行存储以供以后使用。每当用户想要执行某些操作时,服务器API将通过用户的电子邮件地址和访问代码进行调用,确保它真的是该用户。从外部调用API并正确猜测电子邮件地址和访问代码非常困难,因此相对安全。

2. 由于Facebook登录仅用于验证用户,这意味着仅验证用户是否存在且是否拥有帐户,我们实际上不需要FB accessToken。我们只需要FB accessToken用于Facebook服务器的API调用,例如当我们想要检索用户好友列表等情况。在这种情况下,您可以获取Facebook SDK提供的活动会话并从中获取accessToken。

3. 这种情况再次非常简单。如果您仅使用Facebook登录来验证用户,则不必担心用户将来删除帐户。在第一次登录后,您保存他的电子邮件地址,可能是一张图片,以后就不再关心他的Facebook资料了。如果您使用Facebook登录来获取好友列表等信息,则无论如何都不要将此类数据保留在本地存储中,因此一旦用户删除了帐户,他也会失去好友列表。或者,您可以保留他的好友列表,并尝试在他每次使用应用程序时更新它,一旦他删除帐户,好友列表就停止更新,再次取决于您的用户是否使用Facebook帐户。最后一个想法更适合游戏应用程序用例...只是一个想法,并没有被正式接受作为最佳。


1
  • 1 & 2

你可以用多种方式实现,可以从每个登录的电子邮件中获取哈希值并将其保存为用户。然后对于任何登录的用户,可以通过哈希返回的电子邮件并检查该哈希是否已存在。

您还可以让用户使用服务登录,然后使用用户名、电子邮件密码等完成用户创建。然后,当您尝试使用不同的服务进行登录时,可以再次进行注册,并提供一个“我已经有一个帐户”按钮,以及如果您尝试创建相同的帐户,则链接到一个帐户。

将与第三方登录令牌相关联的令牌保存在链接到用户的表中。

我建议对所有用户私人数据进行哈希处理,这可以增加用户对您的应用程序的信任。

  • 3
我从不喜欢依赖第三方账户,认为“完成创建您的账户”流程可以更好地管理账户。允许用户使用第三方账户或用户名和密码进行登录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接