如何将多个身份验证提供程序链接到Android上的Firebase帐户?

时间:2016-10-04 10:33:35

标签: android firebase firebase-authentication

我引用了documentation in Firebase页面。我的问题在于这一段:

  

如果凭据已链接到其他用户帐户,则对linkWithCredential的调用将失败。在这种情况下,您必须根据您的应用处理合并帐户和相关数据:

     

FirebaseUser prevUser = currentUser; currentUser = auth.signInWithCredential(credential).await().getUser(); // Merge prevUser and currentUser accounts and data // ...

我无法弄清楚如何将此代码添加到我的项目中。我何时何地放置此代码

auth.signInWithCredential(credential).await().getUser(); 

进入我的java文件? Android Studio宣布无法解析await()方法。

我该怎么做才能解决这个问题。提前谢谢!

2 个答案:

答案 0 :(得分:0)

当linkWithCredentials调用失败时,您应该处理这部分代码。

这是一个小例子:

mAuth.getCurrentUser().linkWithCredential(credentials).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if (!task.isSuccessful()) {
           FirebaseUser prevUser = currentUser; 
           try {
             currentUser = Tasks.await(auth.signInWithCredential(credential)).getUser();
           } catch (Exception e) {
             e.printStackStrace();
           }
           // Merge prevUser and currentUser accounts and data 
           // ...
        } else {

        }
    }
});

注意:Task.await()不再存在,您应该使用Tasks.await(...)静态方法。

答案 1 :(得分:0)

假设:

    在firebase身份验证上启用了
  • One account per email address设置
  • 用户使用匿名身份验证登录

linkWithCredential通常会因FirebaseAuthUserCollisionException失败,可能会因为此凭据之前用于登录(您可以通过在firebase控制台上搜索此电子邮件进行检查)或此电子邮件帐户用于登录以前但是有不同的提供者(例如用户之前使用谷歌登录使用abc@gmail.com登录,现在他/她使用abc@gmail.com但是使用Facebook登录)要处理它,你需要2个步骤:< / p>

第1步:与匿名帐户关联

private void linkWithAnonymousAccount(final AuthCredential credential) {
    mFirebaseAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        getFirebaseToken();
                    } else {
                        Exception exception = task.getException();
                        if (exception instanceof FirebaseAuthUserCollisionException) {
                            signInWithFirebase(credential);
                        } else {
                            Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                        }
                    }
                }
            });
}

第2步:使用firebase签名

private void signInWithFirebase(AuthCredential credential) {        
    mFirebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        getFirebaseToken();
                    } else {
                        Utils.showDialogMessage(mContext, task.getException().getLocalizedMessage());
                    }
                }
            });
}

Google表示第2步正在合并,因为登录后,您需要获取之前用户的信息并将其添加到新用户中。

我希望它有所帮助。