Dan*_*l F 5 android multiple-accounts firebase-authentication google-signin
我正在编写一个应用程序,它使用 Firebase 身份验证与我的后端服务器进行身份验证。
我提供基于 Google 登录和电子邮件/密码的身份验证。电子邮件/密码是微不足道的。
这是我使用 Google 登录的流程:
1) 我创建了一个with , where with andmGoogleApiClient= 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我得到并从那里我最终通过调用登录到 Firebaseresult= Auth.GoogleSignInApi.getSignInResultFromIntent(data);GoogleSignInAccountaccount=result.getSignInAccount()mFirebaseAuth.signInWithCredential(GoogleAuthProvider.getCredential(account.getIdToken(), null))
4) 然后我“生成”/检索一个 Firebase JWT fbUser.getToken(false),然后我通过它发送到后端服务器以在那里创建/验证用户。
这 4 个步骤起作用了。我能够将应用程序登录到 Firebase 并登录到我的后端服务器。
如果我一次只想使用一个帐户,这很好。实际上,这就是我想要做的,但我的问题如下:
我想像 Gmail 或 Inbox 一样,提供通过上述 4 个步骤至少登录过一次的帐户列表。
当用户点击一个帐户时,我想要做一些与这 4 个步骤有点不同的事情。我想做一些类似无声登录的事情,因为我们已经知道应该登录哪个帐户。我不希望 Google 登录帐户选择对话框出现在我必须再次选择该地址的地方。最坏的情况下,用户最初点击 Account-1@gmail.com 并打算登录 Account-1@gmail.com,但在选择器中,他选择了 Account-2@gmail.com,这有点棘手和烦人。
对此的一个“解决方案”不是提供已知帐户列表,而只是提供“使用 Google 登录”按钮,它可以让 Google Play 服务显示选择器对话框。但这会导致两个问题:1) 显示 Gmail 或 Inbox 等应用程序已知的帐户列表不再有意义,因为对任何帐户的任何点击都会再次询问。2) 当我与互联网断开连接并启动登录时,SignInIntent 将失败,使应用程序处于奇怪的半登录状态,其中显示来自 Account1 的数据但 Account1 实际上未登录(或Account2 显示但实际上未登录),并且在重新连接到 Internet 时,必须再次显示帐户选择器对话框,然后用户必须选择他已经在使用的帐户。这太可怕了。
目前我的解决方案是不允许用户进入登录状态,除非 Google Sign-In + 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),因此我无法使用该方法从一个帐户切换到另一个帐户,因为在请求登录之前我必须先注销该帐户第二个。这让我相信我不能使用这种方法来提供已知帐户的列表,例如在导航抽屉中,因为 switch 将需要该对话框再次显示,这会扰乱工作流程。
那么,问题 2:如何仅使用电子邮件或 user_id 以静默方式登录已经登录过一次的帐户?
另外,我想从帐户选择器对话框中过滤掉已经登录过的帐户,因为这些帐户将通过第二个问题中提到的方法登录(将电子邮件或 user_id 传递给silentSignIn)
感谢您抽时间阅读。
有可能的。
解决问题的关键是在发生“静默”登录(无帐户选择器对话框)时将电子邮件地址传递给GoogleSignInOptions构建器。gsob.setAccountName(...);
GoogleSignInOptions.Builder gsob = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN);
gsob.requestIdToken(ApplicationCore.getMainActivity().getString(R.string.default_web_client_id));
gsob.requestEmail();
if (strEmail != null && !strEmail.equals("")) {
gsob.setAccountName(strEmail); // <------------------- here...
}
mGoogleApiClient = new GoogleApiClient.Builder(ApplicationCore.getMainActivity())
.enableAutoManage(ApplicationCore.getMainActivity(), new GoogleApiClient.OnConnectionFailedListener() {
@Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
// Do some cleanup here
}
})
.addApi(Auth.GOOGLE_SIGN_IN_API, gsob.build())
.build();
};
mGoogleApiClient.connect();
Run Code Online (Sandbox Code Playgroud)
这就会导致以下流程,这就是我想要的。
| 归档时间: |
|
| 查看次数: |
1517 次 |
| 最近记录: |