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

Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Пользователи будут идентифицироваться по одному и тому же идентификатору пользователя Firebase независимо от того, какой поставщик аутентификации они использовали для входа. Например, пользователь, вошедший в систему с помощью пароля, может связать учетную запись 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.

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

Чтобы отменить привязку поставщика аутентификации к учетной записи пользователя, передайте идентификатор поставщика методу 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.");
  }
}

Поиск неисправностей

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