將多個身份驗證提供者連結到一個帳戶

您可以透過將身分驗證提供者憑證連結到現有使用者帳戶,允許使用者使用多個驗證提供者登入您的應用程式。無論使用者用於登入的驗證提供者為何,都可以透過相同的 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.");
  }
}