Аутентификация в Firebase с использованием учетных записей на основе пароля на Android

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

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

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект Android .

  2. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .
  3. Включите вход по электронной почте/паролю:
    1. В консоли Firebase откройте раздел Auth .
    2. На вкладке «Метод входа » включите метод входа по электронной почте и паролю и нажмите «Сохранить» .
  4. В файле Gradle вашего модуля (на уровне приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость для Firebase Authentication . библиотека для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотеки.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.4.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    Используя Firebase Android BoM , ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.

    (Альтернатива) Добавить зависимости библиотеки Firebase без использования BoM

    Если вы решите не использовать Firebase BoM , вы должны указать каждую версию библиотеки Firebase в ее строке зависимости.

    Обратите внимание: если вы используете в своем приложении несколько библиотек Firebase, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.0.0")
    }
    
    Ищете библиотечный модуль, специфичный для Kotlin? Начиная с октября 2023 года ( Firebase BoM 32.5.0) от основного модуля библиотеки могут зависеть как разработчики Kotlin, так и Java (подробнее см. FAQ по этой инициативе ).

Создайте учетную запись на основе пароля

Чтобы создать новую учетную запись пользователя с паролем, выполните следующие шаги при входе в приложение:

  1. В методе onCreate вашей регистрации получите общий экземпляр объекта FirebaseAuth :

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. При инициализации вашей активности проверьте, вошел ли пользователь в систему:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Когда новый пользователь регистрируется с помощью формы регистрации вашего приложения, выполните все шаги проверки новой учетной записи, которые требуются вашему приложению, например проверьте, что пароль новой учетной записи был введен правильно и соответствует вашим требованиям сложности.
  4. Создайте новую учетную запись, передав адрес электронной почты и пароль нового пользователя в createUserWithEmailAndPassword :

    Kotlin+KTX

    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Если была создана новая учетная запись, пользователь также вошел в систему. В обратном вызове вы можете использовать метод getCurrentUser для получения данных учетной записи пользователя.

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

Действия по входу пользователя с паролем аналогичны действиям по созданию новой учетной записи. В процессе входа в приложение выполните следующие действия:

  1. В методе onCreate вашего действия входа в систему получите общий экземпляр объекта FirebaseAuth :

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. При инициализации вашего действия проверьте, вошел ли пользователь в систему:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. Когда пользователь входит в ваше приложение, передайте адрес электронной почты и пароль пользователя в команду signInWithEmailAndPassword :

    Kotlin+KTX

    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Если вход выполнен успешно, вы можете использовать возвращенный FirebaseUser для продолжения.

Рекомендуется: установите политику паролей.

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

Чтобы настроить политику паролей для вашего проекта, откройте вкладку «Политика паролей» на странице «Настройки аутентификации» консоли Firebase :

Настройки аутентификации

Политики паролей Firebase Authentication поддерживают следующие требования к паролям:

  • Требуется символ нижнего регистра

  • Требуется символ верхнего регистра

  • Требуется числовой символ

  • Требуется небуквенно-цифровой символ

    Следующие символы удовлетворяют требованию небуквенно-цифровых символов: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • Минимальная длина пароля (от 6 до 30 символов; по умолчанию — 6).

  • Максимальная длина пароля (максимальная длина 4096 символов)

Вы можете включить принудительное применение политики паролей в двух режимах:

  • Требовать : попытки войти в систему завершаются неудачно, пока пользователь не обновит пароль, соответствующий вашей политике.

  • Уведомление : пользователям разрешено входить в систему с несоответствующим паролем. При использовании этого режима вам следует проверить, соответствует ли пароль пользователя политике на стороне клиента, и предложить пользователю каким-либо образом обновить свой пароль, если он не соответствует.

Новым пользователям всегда необходимо выбрать пароль, соответствующий вашей политике.

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

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

Некоторые методы Firebase Authentication , которые принимают адреса электронной почты в качестве параметров, выдают определенные ошибки, если адрес электронной почты не зарегистрирован, когда его необходимо зарегистрировать (например, при входе в систему с адресом электронной почты и паролем), или зарегистрирован, когда его нельзя использовать (например, при изменении адреса электронной почты пользователя). Хотя это может быть полезно для предложения пользователям конкретных средств защиты, злоумышленники также могут использовать его для обнаружения адресов электронной почты, зарегистрированных вашими пользователями.

Чтобы снизить этот риск, мы рекомендуем вам включить защиту перечисления электронной почты для вашего проекта с помощью инструмента Google Cloud gcloud . Обратите внимание, что включение этой функции меняет поведение отчетов об ошибках Firebase Authentication : убедитесь, что ваше приложение не полагается на более конкретные ошибки.

Следующие шаги

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

  • В ваших приложениях вы можете получить базовую информацию профиля пользователя из объекта FirebaseUser . См. Управление пользователями .

  • В правилах безопасности базы данных реального времени и Cloud Storage Firebase Realtime Database вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

Чтобы выйти из системы, вызовите signOut :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();