android - 最佳实践(最适合 Android): authenticate a user with Facebook or Google login

标签 android security authentication facebook-login

我正在开发一个应用程序,其中包含用于登录的 Facebook 和 Google 选项,以及经典的电子邮件+密码登录。我发现自己想知道有关使用第三方 API 登录的几件事:

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

2。 如果用户使用 Facebook 登录,您可以获得 accessToken、userId、用户电子邮件等。验证用户的最佳实践是什么,它仍然是最安全的方式?我应该将他的 facebook accessToken 和电子邮件地址直接发送到服务器吗?如果 accessToken 确实存在于 Facebook 上,服务器是否应该检查 Facebook? 在服务器端生成应用程序私有(private)访问 token 的最佳和最安全的方法是什么?我听说过一些关于 MD5 哈希的信息...然后我应该在 API 调用中只使用这个新生成的访问 token 而不使用任何 facebook 凭据吗?或者我应该使用 Facebook 凭据,从而将它们保存在服务器/客户端? 我将在我的应用程序的服务器端使用 Java App-engine。

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

  1. 我是否应该定期检查 Facebook 的访问 token 是否仍然有效?为什么以及如何以及多久一次?

我不确定我问的地方是否正确。如果我错了,请重定向我应该走的路,也许是这些最佳实践的一些链接?到目前为止,我还没有找到任何可以回答我所有问题的东西。我猜它与编码和安全相关。 感谢您提供的所有提示和技巧。

最佳答案

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

1。 是的,如果您希望您的用户使用他们的 Facebook 或 Google 帐户注册,您调用 API,获取电子邮件地址(在 Android 上使用 Google 的 AccountManager 更容易),将其发送到您的服务器以保存电子邮件地址,关联用户 ID 并生成它自己的访问代码。访问代码将被发送回您的客户端应用程序以存储以供以后使用。每当用户想要进行某些操作时,服务器 API 都会使用用户的电子邮件地址和访问代码调用,您可以确定它确实是用户。从外部调用 API 并正确猜测电子邮件地址和访问代码要困难得多,因此它有点安全。

2。 由于 Facebook 登录仅用于验证用户身份,这意味着仅验证用户是否存在并拥有帐户,因此我们实际上不需要 FB accessToken。我们只需要 FB accessToken 来调用 Facebook 服务器的 API,例如,当我们想要检索用户的 friend 列表等时。在这种情况下,您可以获取 Facebook SDK 提供的 Activity session 并从那里获取 accessToken。

3。 这个案例又很简单。 如果您只使用 Facebook 登录来验证用户身份,那么您不会关心用户将来是否删除了他的帐户。第一次登录后,您保存他的电子邮件地址,可能是一张照片,不再关心他的 Facebook 个人资料。 如果您使用 Facebook 登录来获取好友列表等,则无论如何您都不会将此类数据保存在本地存储中,因此一旦用户删除他的帐户,他的好友列表也会丢失。或者,您可以保留他的好友列表,并在他每次使用您的应用程序时尝试更新它,一旦他删除了他的帐户,好友列表就会停止更新,并且再次由您的用户决定是否使用 Facebook 帐户。最后一个想法更适合游戏应用用例....只是一个想法,而不是官方公认的最佳。

关于android - 最佳实践(最适合 Android): authenticate a user with Facebook or Google login,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974389/

相关文章:

android - 如何使用 ActionBarSherlock、ViewPagerIndicator 和 SlidingMenu

java - 将 EditText 更改为 TextView

java - Weblogic - java.lang.ClassNotFoundException : org. bouncycaSTLe.jce.provider.JCEMac$DES9797Alg3

authentication - Nextjs next-auth sessionProvider 不读取 session 属性 Typescript

authentication - UseCookieAuthentication 和 UseIdentity 的区别?

java - 如何注入(inject)用户名(不是身份验证)?

android - 当您在 Eclipse 中获得堆栈中包含 SDK 类的堆栈跟踪时,如何查看 SDK 源代码?

android - 日历应用程序如何动态更改图标? (像素安卓牛轧糖)

javascript - 如果 PHP 服务器脚本使用 key 调用 javascript 文件,它是否会暴露?

security - 只有在完全限定 exe 路径时才会出现权限问题。为什么不总是?