Как управлять пользователями в Firebase

Как создать пользователя

Создать пользователя можно следующими способами:

  • Из приложения. Создайте нового пользователя в проекте Firebase, вызвав метод createUserWithEmailAndPassword или выполнив первый вход пользователя с помощью федеративного поставщика идентификационной информации, например Google или Facebook.

  • В консоли Firebase создайте нового пользователя с аутентификацией по паролю на вкладке Безопасность > Аутентификация > Пользователи.

Как получить информацию о пользователе, выполнившем вход

Рекомендуемый способ получить текущего пользователя – вызвать метод getCurrentUser. Если ни один пользователь не вошел в аккаунт, getCurrentUser возвращает значение null:

Kotlin

val user = Firebase.auth.currentUser
if (user != null) {
    // User is signed in
} else {
    // No user is signed in
}

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
} else {
    // No user is signed in
}

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

getCurrentUser также может вернуть null, потому что объект аутентификации не был инициализирован.

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

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

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

Kotlin

val user = Firebase.auth.currentUser
user?.let {
    // Name, email address, and profile photo Url
    val name = it.displayName
    val email = it.email
    val photoUrl = it.photoUrl

    // Check if user's email is verified
    val emailVerified = it.isEmailVerified

    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getIdToken() instead.
    val uid = it.uid
}

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address, and profile photo Url
    String name = user.getDisplayName();
    String email = user.getEmail();
    Uri photoUrl = user.getPhotoUrl();

    // Check if user's email is verified
    boolean emailVerified = user.isEmailVerified();

    // The user's ID, unique to the Firebase project. Do NOT use this value to
    // authenticate with your backend server, if you have one. Use
    // FirebaseUser.getIdToken() instead.
    String uid = user.getUid();
}

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

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

Kotlin

val user = Firebase.auth.currentUser
user?.let {
    for (profile in it.providerData) {
        // Id of the provider (ex: google.com)
        val providerId = profile.providerId

        // UID specific to the provider
        val uid = profile.uid

        // Name, email address, and profile photo Url
        val name = profile.displayName
        val email = profile.email
        val photoUrl = profile.photoUrl
    }
}

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    for (UserInfo profile : user.getProviderData()) {
        // Id of the provider (ex: google.com)
        String providerId = profile.getProviderId();

        // UID specific to the provider
        String uid = profile.getUid();

        // Name, email address, and profile photo Url
        String name = profile.getDisplayName();
        String email = profile.getEmail();
        Uri photoUrl = profile.getPhotoUrl();
    }
}

Как изменить профиль пользователя

Вы можете обновить основную информацию профиля пользователя – отображаемое имя и URL фото профиля – с помощью метода updateProfile. Пример:

Kotlin

val user = Firebase.auth.currentUser

val profileUpdates = userProfileChangeRequest {
    displayName = "Jane Q. User"
    photoUri = Uri.parse("https://example.com/jane-q-user/profile.jpg")
}

user!!.updateProfile(profileUpdates)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "User profile updated.")
        }
    }

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .setPhotoUri(Uri.parse("https://example.com/jane-q-user/profile.jpg"))
        .build();

user.updateProfile(profileUpdates)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User profile updated.");
                }
            }
        });

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

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

Kotlin

val user = Firebase.auth.currentUser

user!!.updateEmail("user@example.com")
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "User email address updated.")
        }
    }

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.updateEmail("user@example.com")
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User email address updated.");
                }
            }
        });

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

Вы можете отправить пользователю письмо с подтверждением адреса, используя метод sendEmailVerification. Пример:

Kotlin

val user = Firebase.auth.currentUser

user!!.sendEmailVerification()
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Email sent.")
        }
    }

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();

user.sendEmailVerification()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });

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

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

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

Kotlin

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

Как задать пароль пользователя

Вы можете задать пароль пользователя с помощью метода updatePassword. Пример:

Kotlin

val user = Firebase.auth.currentUser
val newPassword = "SOME-SECURE-PASSWORD"

user!!.updatePassword(newPassword)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "User password updated.")
        }
    }

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String newPassword = "SOME-SECURE-PASSWORD";

user.updatePassword(newPassword)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User password updated.");
                }
            }
        });

Как отправить письмо для сброса пароля

Вы можете отправить пользователю письмо с инструкциями по сбросу пароля с помощью метода sendPasswordResetEmail. Пример:

Kotlin

val emailAddress = "user@example.com"

Firebase.auth.sendPasswordResetEmail(emailAddress)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "Email sent.")
        }
    }

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
String emailAddress = "user@example.com";

auth.sendPasswordResetEmail(emailAddress)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Email sent.");
                }
            }
        });

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

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

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

Kotlin

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

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

Как удалить пользователя

Удалить аккаунт пользователя можно с помощью метода delete. Пример:

Kotlin

val user = Firebase.auth.currentUser!!

user.delete()
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d(TAG, "User account deleted.")
        }
    }

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "User account deleted.");
                }
            }
        });

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

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

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

Kotlin

val user = Firebase.auth.currentUser!!

// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
val credential = EmailAuthProvider
    .getCredential("user@example.com", "password1234")

// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
    .addOnCompleteListener { Log.d(TAG, "User re-authenticated.") }

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

// Get auth credentials from the user for re-authentication. The example below shows
// email and password credentials but there are multiple possible providers,
// such as GoogleAuthProvider or FacebookAuthProvider.
AuthCredential credential = EmailAuthProvider
        .getCredential("user@example.com", "password1234");

// Prompt the user to re-provide their sign-in credentials
user.reauthenticate(credential)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Log.d(TAG, "User re-authenticated.");
            }
        });

Как импортировать аккаунты пользователей

Вы можете импортировать аккаунты пользователей из файла в проект Firebase, используя команду auth:import Firebase CLI. Пример:

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