首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android GoogleSignIn:多个帐户同时+失败时延迟登录

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

Stack Overflow用户
提问于 2017-01-17 21:12:36
回答 1查看 1.8K关注 0票数 6

我正在编写一个应用程序,它利用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)进行签名。

谢谢你抽出时间阅读这篇文章。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-30 10:29:08

这是可能的。

解决这个问题的关键是在出现“沉默”登录(没有帐户选择器对话框)时,通过GoogleSignInOptions构建器将电子邮件地址传递给gsob.setAccountName(...);

代码语言:javascript
复制
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();

这将导致下面的流,这就是我想要的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41707085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档