2016-10-04 23 views
3

我参考了documentation in Firebase页面。我的问题在于:如何将多个身份验证提供程序链接到Android上的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()方法。

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

回答

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(...)的静态方法来代替。

+0

好吧,让我试试这个 –

+0

@MyWill你能解决这个问题吗? – Shubham

+0

我还没有。你是? –

0

假设:

  • One account per email address设置在火力认证功能
  • 用户用匿名身份验证登录

linkWithCredential通常失败,FirebaseAuthUserCollisionException,它可能发生或者是因为此凭据用于登录之前(您可以通过在Firebase控制台上搜索此电子邮件进行检查),或者此电子邮件帐户用于登录之前但与不同的提供商(例如作为一个用户登录使用谷歌登录[email protected]之前,现在他/她使用[email protected],但与Facebook登录)处理它,你需要2个步骤:

第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步:签订火力

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()); 
        } 
       } 
      }); 
} 

谷歌表示,该步骤2中合并,因为登录后,你需要获得以前的用户和PU的信息进入新用户。

我希望它有帮助。

+0

getFirebaseToken()方法是什么? – pkBhati

+0

如果您拥有自己的后端,则在使用Firebase进行身份验证后,您应该获取Firebase标记以发送到服务器进行验证。详情可以在https://firebase.google找到。com/docs/auth/admin/verify-id-tokens – thanhbinh84

+0

不,我没有自己的后端。我该如何继续使用Firebase? – pkBhati

相关问题