將多個驗證供應商連結至一個帳戶

您可以將驗證供應商憑證連結至現有使用者帳戶,允許使用者透過多個驗證供應商登入應用程式。無論使用者透過哪個驗證提供者登入,系統都會使用相同的 Firebase 使用者 ID 識別使用者。舉例來說,以密碼登入的使用者可以連結 Google 帳戶,日後就能透過任一方法登入。或者,匿名使用者可以連結 Facebook 帳戶,然後稍後使用 Facebook 登入,繼續使用您的應用程式。

事前準備

在應用程式中新增對兩個以上驗證供應商的支援 (可能包括匿名驗證)。

如要將驗證供應商憑證連結至現有使用者帳戶,請按照下列步驟操作:

  1. 使用任何驗證供應商或方法登入使用者。

  2. 完成新驗證提供者的登入流程,但不要呼叫任何 signInWith 方法。例如,取得使用者的 Google ID 權杖、Facebook 存取權杖,或是電子郵件和密碼。

  3. 取得新驗證供應商的 Credential 物件:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. Credential 物件傳遞至登入使用者的 linkWithCredential() 方法:

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

如果對 linkWithCredential() 的呼叫成功,使用者現在就能使用任何已連結的驗證供應商登入,並存取相同的 Firebase 資料。

您可以取消驗證供應商與帳戶的連結,這樣使用者就無法再透過該供應商登入。

如要取消授權提供者與使用者帳戶的連結,請將提供者 ID 傳遞至 unlink() 方法。您可以從 User 物件的 providerData 屬性,取得連結至使用者的驗證提供者 ID。

try {
  await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "no-such-provider":
      print("The user isn't linked to the provider or the provider "
          "doesn't exist.");
      break;
    default:
      print("Unknown error.");
  }
}

疑難排解

如果嘗試連結多個帳戶時發生錯誤,請參閱已驗證電子郵件地址的說明文件