Android GoogleSignIn:同时有多个帐户+失败时延迟登录

时间:2017-01-17 21:12:36

标签: android firebase-authentication google-signin multiple-accounts

我正在编写一个使用Firebase身份验证对我的后端服务器进行身份验证的应用。

我提供Google登录和基于电子邮件/密码的身份验证。电子邮件/密码很简单。

这是我使用Google登录的流程:

1)我使用mGoogleApiClient创建 = new GoogleApiClient .addApi(Auth.GOOGLE_SIGN_IN_API, gso),其中 gso = GoogleSignInOptions使用.requestIdToken(...)).requestEmail()

2)我致电startActivityForResult( signInIntent , RC_GOOGLE_SIGN_IN); signInIntent = Auth.GoogleSignInApi.getSignInIntent( mGoogleApiClient )

3)在onActivityResult我得到 result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);,然后GoogleSignInAccount account = result .getSignInAccount()我最终通过致电mFirebaseAuth.signInWithCredential(GoogleAuthProvider.getCredential( account 登录Firebase .getIdToken(), null))

4)然后我通过fbUser.getToken(false)生成" /检索Firebase JWT,然后发送到后端服务器以在那里创建/验证用户。

4个步骤。我可以将应用程序签名到Firebase和我的后端服务器中。

如果我想一次只使用一个帐户,这很好。实际上,这就是我想要做的,但我的问题是以下

我想,就像Gmail或Inbox一样,提供一个帐户列表,这些帐户已通过上述4个步骤至少签署过一次。

当用户点击某个帐户时,我想要做的事情与这4个步骤略有不同。我想做一些像沉默登录的事情,因为我们已经知道应该登录哪个帐户。我不希望Google登录帐户选择对话框显示在我必须再次选择该地址的位置。最糟糕的情况是用户最初点击Account-1@gmail.com打算登录Account-1@gmail.com,但在选择器中他选择了Account-2@gmail.com,这有点棘手而烦人。

一个"解决方案"这不是提供已知帐户的列表,而只是提供与Google" -Button的登录,它允许Google Play服务提供选择器对话框。但这会导致两个问题: 1)显示应用程序已知的帐户列表(如Gmail或收件箱)不再有意义,因为任何帐户的任何点击都会再次要求。 2)当我从互联网断开并启动登录时,SignInIntent将失败,使应用程序处于奇怪的半签名状态,其中显示来自Account1的数据但是Account1实际上未登录(或者显示了Account2但实际上没有登录),并且在重新连接到互联网时,必须再次显示“帐户选择器”对话框,然后用户必须选择他正在使用的帐户。这太糟糕了。

目前我的解决方案是不允许用户进入登录状态,除非Google登录+ Firebase设法正确登录,这意味着我无法从本地数据库加载数据用户和用户无法再次访问互联网之前无法使用他的数据。这非常糟糕。

我想允许用户切换帐户,如果Google登录失败,则让Android / Google登录记住该帐户,并向用户显示该帐户的数据,并尽快互联网连接再次出现我希望用户默默地登录Firebase和我的后端,而不显示帐户选择器对话框。

问题1:这可以用Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient)来实现吗?如果是这样,怎么样?因为我总是得到一个GoogleSignInStatusCodes.SIGN_IN_REQUIRED,迫使我从上面经过传统的4个步骤并显示帐户选择器对话框。另请注意,在我成功登录Google后,我在登录Firebase帐户后退出该Google帐户,因为我不再需要该Google帐户。此外,在任何登录尝试之前,我致电Auth.GoogleSignInApi.signOut(mGoogleApiClient);如果这是GoogleSignInStatusCodes.SIGN_IN_REQUIRED的原因,我该如何保留此类帐户信息,或者图书馆会处理此问题?

另外,我没有办法将电子邮件地址传递给Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient),因此我无法使用该方法从一个帐户切换到另一个帐户,因为我必须签名在请求登录第二个帐户之前删除一个帐户。这使我相信我无法使用此方法提供已知帐户的列表,例如在导航抽屉中,因为切换将需要再次显示Dialog,这会影响工作流。< / p>

所以,问题2 :我如何只使用电子邮件或user_id以静默方式登录已登录过的帐户?

作为额外的,我想从帐户选择器对话框中筛选出已经登录过一次的帐户,因为这些帐户会通过第二个问题中提到的方法登录(通过一个电子邮件或user_id到silentSignIn)

感谢您花时间阅读本文。

1 个答案:

答案 0 :(得分:2)

有可能。

解决问题的关键是通过GoogleSignInOptions在{&#34;沉默&#34;登录(无账号选择对话框)应该出现。

gsob.setAccountName(...);

然后导致以下流程,这就是我想要的。

enter image description here