Свяжите несколько поставщиков аутентификации с учетной записью

Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя Firebase независимо от поставщика аутентификации, который они использовали для входа. Например, пользователь, вошедший в систему с паролем, может связать учетную запись Google и войти в систему любым из методов в будущем. Или анонимный пользователь может связать учетную запись Facebook, а затем позже войти в систему с помощью Facebook, чтобы продолжить использование вашего приложения.

Прежде чем начать

Добавьте в свое приложение поддержку двух или более поставщиков аутентификации (возможно, включая анонимную аутентификацию).

Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:

  1. Войдите в систему, используя любой поставщик или метод аутентификации.

  2. Завершите процесс входа для нового поставщика проверки подлинности, включая вызов одного из методов signInWith -. Например, получите токен идентификатора Google пользователя, токен доступа к 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.

Вы можете отменить связь поставщика аутентификации с учетной записью, чтобы пользователь больше не мог входить в систему с помощью этого поставщика.

Чтобы отсоединить провайдера аутентификации от учетной записи пользователя, передайте идентификатор провайдера методу unlink() . Вы можете получить идентификаторы поставщиков аутентификации, связанных с пользователем, из providerData объекта User .

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.");
 
}
}