Управление пользователями в Firebase

Создать пользователя

Создать нового пользователя в проекте Firebase можно четырьмя способами:

Вы также можете создать новых пользователей с аутентификацией по паролю в разделе «Аутентификация» консоли Firebase на странице «Пользователи».

Получить профиль пользователя

Чтобы получить информацию о профиле пользователя, используйте свойства объекта User . Существует три способа получить объект User , представляющий текущего пользователя:

  • Потоки authStateChanges , idTokenChanges и userChanges : ваши слушатели получат текущего User или null , если ни один пользователь не аутентифицирован:

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

    При запуске приложения событие срабатывает после восстановления учётных данных пользователя (если таковые имеются) из локального хранилища. Это означает, что ваши обработчики событий всегда будут вызываться при инициализации состояния пользователя. Затем, при каждом изменении состояния аутентификации, будет сгенерировано новое событие с обновлённым состоянием пользователя.

    Отслеживая состояние аутентификации, вы можете создать пользовательский интерфейс, реагирующий на эти изменения. Не помещайте authStateChanges().listen(...) непосредственно в метод сборки виджета, так как это создаст новую подписку при каждой пересборке. Если вам нужно обновить пользовательский интерфейс в зависимости от состояния аутентификации, используйте StreamBuilder :

    StreamBuilder<User?>(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
      if (snapshot.hasError) {
        return const Text('Something went wrong');
      }
    
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text("Loading...");
      }
    
      if (!snapshot.hasData) {
        return const SignInScreen();
      }
    
      final user = snapshot.data!;
      return HomeScreen(userId: user.uid);
    },
    )
    

    Такой подход обеспечивает автоматическую перестройку дерева виджетов при изменении состояния аутентификации пользователя.

  • Объект UserCredential , возвращаемый методами аутентификации ( signIn -): объект UserCredential имеет свойство user с текущим User :

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • Свойство currentUser экземпляра FirebaseAuth : если вы уверены, что пользователь в настоящее время вошел в систему, вы можете получить доступ к User из свойства currentUser :

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    currentUser может иметь null по двум причинам:

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

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

Чтобы получить информацию профиля, полученную от поставщиков входа, связанных с пользователем, используйте свойство providerData . Например:

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

Обновить профиль пользователя

Вы можете обновить основную информацию профиля пользователя — отображаемое имя пользователя и URL-адрес фотографии профиля — с помощью методов update . Например:

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

Установить адрес электронной почты пользователя

Вы можете установить адрес электронной почты пользователя с помощью метода updateEmail() . Например:

await user?.updateEmail("janeq@example.com");

Отправить пользователю письмо с подтверждением

Вы можете отправить пользователю электронное письмо для подтверждения адреса с помощью метода sendEmailVerification() . Например:

await user?.sendEmailVerification();

Вы можете настроить шаблон электронной почты, используемый в разделе «Аутентификация» консоли Firebase , на странице «Шаблоны электронной почты». См. раздел «Шаблоны электронной почты» в справочном центре Firebase.

Также можно передать состояние через URL-адрес продолжения для перенаправления обратно в приложение при отправке проверочного письма.

Кроме того, вы можете локализовать письмо с подтверждением, обновив код языка в экземпляре Auth перед отправкой письма. Например:

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

Установить пароль пользователя

Вы можете установить пароль пользователя с помощью метода updatePassword() . Например:

await user?.updatePassword(newPassword);

Отправить электронное письмо для сброса пароля

Вы можете отправить пользователю электронное письмо для сброса пароля с помощью метода sendPasswordResetEmail() . Например:

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

Вы можете настроить шаблон электронной почты, используемый в разделе «Аутентификация» консоли Firebase , на странице «Шаблоны электронной почты». См. раздел «Шаблоны электронной почты» в справочном центре Firebase.

Также можно передать состояние через URL-адрес продолжения , чтобы перенаправить обратно в приложение при отправке письма с просьбой сбросить пароль.

Кроме того, вы можете локализовать электронное письмо для сброса пароля, обновив код языка в экземпляре Auth перед отправкой письма. Например:

await FirebaseAuth.instance.setLanguageCode("fr");

Вы также можете отправлять письма для сброса пароля из консоли Firebase.

Удалить пользователя

Удалить учётную запись пользователя можно с помощью метода delete() . Например:

await user?.delete();

Вы также можете удалить пользователей из раздела «Аутентификация» консоли Firebase на странице «Пользователи».

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

Некоторые действия, требующие повышенной безопасности, такие как удаление учётной записи , настройка основного адреса электронной почты и смена пароля, требуют, чтобы пользователь недавно входил в систему. Если вы выполните одно из этих действий, а пользователь вошел в систему слишком давно, действие завершится ошибкой и выдаст исключение FirebaseAuthException с кодом requires-recent-login . В этом случае выполните повторную аутентификацию пользователя, получив от него новые учётные данные и передав их методу reauthenticate . Например:

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

Импорт учетных записей пользователей

Вы можете импортировать учётные записи пользователей из файла в свой проект Firebase с помощью команды auth:import Firebase CLI. Например:

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14