2016-10-04 86 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

相關問題