我正在编写一个应用程序,它利用Firebase身份验证与我的后端服务器进行身份验证。
我提供谷歌登录和基于电子邮件/密码的认证。电子邮件/密码是微不足道的。
这是我使用Google登录的流程:
1)我用mGoogleApiClient= new GoogleApiClient和.addApi(Auth.GOOGLE_SIGN_IN_API, gso)创建了一个.addApi(Auth.GOOGLE_SIGN_IN_API, gso),其中gso= GoogleSignInOptions使用.requestIdToken(...))和.requestEmail()
2)我称startActivityForResult(signInIntent, RC_GOOGLE_SIGN_IN);为signInIntent= Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
3)在result= Auth.GoogleSignInApi.getSignInResultFromIntent(data);中,我得到了GoogleSignInAccountaccount=result.getSignInAccount(),在那里,我通过调用mFirebaseAuth.signInWithCredential(GoogleAuthProvider.getCredential(account.getIdToken(), null))最终登录到Firebase
4)然后通过/retrieve“生成”一个Firebase JWT,然后将其发送到后端服务器,以便在那里创建/验证用户。
的四个步骤工作。我能够签署到Firebase和我的后端服务器应用程序。
如果我一次只使用一个帐户的话,这很好。实际上,这就是我想要做的,但是我的问题是下面的
我想,就像Gmail或收件箱一样,通过上面提到的四个步骤,提供至少一次签名的帐户列表。
当用户单击一个帐户时,我希望这样做,这与这4个步骤有点不同。我想做一些类似于无声登录的事情,因为我们已经知道应该登录哪个帐户。我不希望谷歌登录帐户选择对话框出现在哪里,我必须再次选择那个地址。最坏的情况是,用户最初使用帐户-1@gmail.com并打算在帐户中签名-1@gmail.com,但在选择器中,他选择了账号-2@gmail.com,这将是有点棘手和烦人的。
解决这个问题的一个“解决方案”不是提供一个已知帐户的列表,而是提供一个“与Google登录”的-Button,它允许Google服务呈现选择器对话框。但是这导致了两个问题: 1)显示应用程序所知道的帐户列表不再有意义,就像Gmail或收件箱一样,因为对任何帐户的任何点击都会要求第二次点击。2)当我与互联网断开连接并启动登录时,SignInIntent将失败,使应用程序处于一种奇怪的半签名状态,其中显示来自Account1的数据,但Account1实际上没有登录(或者显示Account2,但实际上没有登录),在重新连接到internet时,必须再次显示帐户选择对话框,用户必须选择他已经使用的帐户。这太可怕了。
目前,我的解决方案是不允许用户进入登录状态,除非Google登录+ Firebase能够正确登录,这意味着我不会从本地数据库为该用户加载数据,用户在再次上网之前不能使用他的数据。这太糟了。
我希望允许用户切换帐户,如果Google登录失败,那么让Android/Google登录--记住这个帐户,我向用户展示他的账户数据,一旦互联网连接再次出现,我想在用户中悄悄地登录到Firebase和我的后台,而没有显示帐户选择者对话框。
问题1:能用Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient)归档吗?如果是这样的话,是怎么做的?因为我总是得到一个GoogleSignInStatusCodes.SIGN_IN_REQUIRED,这迫使我通过传统的4个步骤,从上面和显示帐户选择对话框。顺便提一句,在我成功登录谷歌之后,我在登录Firebase帐户后,就退出了那个Google帐户,因为我不再需要那个Google帐户了。另外,在我调用Auth.GoogleSignInApi.signOut(mGoogleApiClient);之前,如果这是GoogleSignInStatusCodes.SIGN_IN_REQUIRED的原因,我如何持久化这样的帐户信息,或者库会处理这个问题?
而且,我没有办法将电子邮件地址传递给Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient),所以我不能使用这种方法从一个帐户切换到另一个帐户,因为在请求第二个帐户登录之前,我必须先签下一个帐户。这让我相信,我不能使用这个方法来提供一个已经知道的帐户列表,例如在导航抽屉中,因为开关将要求对话框再次出现,这会扰乱工作流程。
那么,问题2:我如何才能在一个只通过电子邮件或user_id以沉默的方式一次性签名的帐户中注册呢?
作为一个额外的,我想从帐户选择对话框中筛选出已经一次登录的帐户,因为这些帐户将通过第二个问题中提到的方法(将电子邮件或user_id传递给silentSignIn)进行签名。
谢谢你抽出时间阅读这篇文章。
发布于 2017-01-30 10:29:08
这是可能的。
解决这个问题的关键是在出现“沉默”登录(没有帐户选择器对话框)时,通过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();这将导致下面的流,这就是我想要的。

https://stackoverflow.com/questions/41707085
复制相似问题