Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

Вы можете разрешить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности, связав учетные данные поставщика проверки подлинности с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя 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("Unkown error.");
  }
}