Как аутентифицироваться в Firebase на устройстве Android с помощью номера телефона

Вы можете использовать Firebase Authentication, чтобы войти в аккаунт пользователя, отправив SMS-сообщение на его телефон. Пользователь входит в аккаунт с помощью одноразового кода из SMS.

Самый простой способ добавить в приложение вход с помощью номера телефона – использовать FirebaseUI. В этот пакет входит готовый виджет для входа, который поддерживает вход с помощью номера телефона, пароля и федеративный вход. В этом документе рассказывается, как реализовать вход с номером телефона с помощью Firebase SDK.

Подготовка

  1. Если вы ещё этого не сделали, добавьте Firebase в проект для Android.
  2. В файле 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:34.19.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:24.2.0")
    }
  3. Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
  4. Если вы ещё не указали хеш SHA-1 своего приложения в консоли Firebase, сделайте это. Информацию о том, как найти хеш SHA-1 приложения, можно найти в разделе Аутентификация клиента.

Проблемы с безопасностью

Аутентификация только по номеру телефона, хотя и удобна, менее безопасна, чем другие доступные методы, поскольку номер телефона легко передать другому пользователю. Кроме того, на устройствах с поддержкой нескольких пользователей любой пользователь, который может получать SMS-сообщения, может войти в аккаунт, используя номер телефона устройства.

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

Как включить вход с помощью номера телефона в проекте Firebase

Чтобы пользователи могли входить в аккаунт с помощью SMS, сначала включите в проекте Firebase метод входа с номером телефона:

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Sign-in method (Способ входа) включите поставщика для входа с помощью Phone (Телефона).
  3. Настройте правило для регионов, в которые вы хотите разрешить или запретить отправку SMS. Правило для региона SMS помогает защитить приложения от злоупотреблений с помощью SMS. Для новых проектов политика по умолчанию не разрешает использование регионов.
    1. В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
    2. В разделе Правила в отношении регионов хранения данных для SMS настройте правила в отношении регионов хранения данных для SMS.

Как включить проверку приложений

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

  • Play Integrity API. Если на устройстве пользователя установлено приложение Google Play services и Firebase Authentication может подтвердить его подлинность с помощью Play Integrity API, вход по номеру телефона будет разрешен. Play Integrity API включен в проекте, принадлежащем Google, а не в вашем проекте. Это сделал пользователь Firebase Authentication. Это не влияет на квоты Play Integrity API в вашем проекте. Поддержка Play Integrity доступна в Authentication SDK версии 21.2.0 или более поздней (Firebase BoM версии 31.4.0 или более поздней).

    Чтобы использовать Play Integrity, укажите цифровой отпечаток SHA-256 для своего приложения, если вы ещё этого не сделали.

    1. В консоли Firebase перейдите на вкладку Настройки > Общие.
    2. Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение Android и добавьте цифровой отпечаток SHA-256 в поле Цифровые отпечатки сертификата SHA.

    О том, как получить цифровой отпечаток SHA приложения, можно прочитать в разделе об аутентификации клиентов.

  • Проверка reCAPTCHA. Если Play Integrity нельзя использовать, например на устройстве пользователя не установлен Google Play services, Firebase Authenticationдля входа в аккаунт на телефоне используется проверка reCAPTCHA. Часто для прохождения проверки reCAPTCHA пользователю не нужно ничего решать. Обратите внимание, что для этого процесса необходимо, чтобы с вашим приложением был связан отпечаток SHA-1. Для этого процесса также требуется, чтобы ключ API был без ограничений или добавлен в белый список для PROJECT_ID.firebaseapp.com.

    Вот несколько ситуаций, в которых может быть активирована reCAPTCHA:

    • Если на устройстве конечного пользователя не установлено приложение Google Play services.
    • Если приложение не распространяется через Google Play Store (на Authentication SDK версии 21.2.0 или более поздней).
    • Если полученный токен SafetyNet был недействительным (в версиях SDK Authentication ниже v21.2.0).

    Если для проверки приложения используется SafetyNet или Play Integrity, поле %APP_NAME% в шаблоне SMS заполняется названием приложения, полученным из Google Play Store. Если срабатывает reCAPTCHA, в поле %APP_NAME% записывается значение PROJECT_ID.firebaseapp.com.

Вы можете принудительно запустить проверку reCAPTCHA с помощью команды forceRecaptchaFlowForTesting. Вы можете отключить проверку приложений (при использовании вымышленных номеров телефонов) с помощью команды setAppVerificationDisabledForTesting.

Устранение неполадок

  • Ошибка "Отсутствует начальное состояние" при использовании reCAPTCHA для проверки приложений

    Это может произойти, если проверка reCAPTCHA завершилась успешно, но пользователь не был перенаправлен обратно в нативное приложение. В этом случае пользователь будет перенаправлен на резервный URL PROJECT_ID.firebaseapp.com/__/auth/handler. В браузере Firefox открытие ссылок на нативные приложения по умолчанию отключено. Если вы видите указанную выше ошибку в Firefox, выполните инструкции из статьи Как настроить Firefox для Android, чтобы ссылки открывались в приложениях.

Отправить код подтверждения на телефон пользователя.

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

Затем передайте номер телефона пользователя методу PhoneAuthProvider.verifyPhoneNumber, чтобы Firebase проверил его. Пример:

Kotlin

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

Метод verifyPhoneNumber является реентерабельным. Если вы вызовете его несколько раз, например в методе onStart класса activity, метод verifyPhoneNumber не отправит второе SMS, пока не истечет время ожидания исходного запроса.

Вы можете использовать это поведение, чтобы возобновить процесс входа с номером телефона, если ваше приложение закрывается до того, как пользователь сможет войти в аккаунт (например, пока пользователь использует приложение для обмена SMS). После звонка в магазин "verifyPhoneNumber" установите флаг, указывающий на то, что проверка выполняется. Затем сохраните флаг в методе onSaveInstanceState класса Activity и восстановите его в методе onRestoreInstanceState. Наконец, в методе onStart класса Activity проверьте, выполняется ли уже проверка, и если да, снова вызовите метод verifyPhoneNumber. Обязательно снимите флаг, когда проверка будет завершена или не пройдена (см. раздел Обратные вызовы для проверки).

Чтобы легко обрабатывать поворот экрана и другие случаи перезапуска Activity, передайте свой объект Activity в метод verifyPhoneNumber. Обратные вызовы будут автоматически отсоединены, когда объект Activity остановится, поэтому вы можете свободно писать код перехода интерфейса в методах обратного вызова.

SMS-сообщение, отправленное Firebase, также можно локализовать, указав язык аутентификации с помощью метода setLanguageCode в экземпляре 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();

При вызове PhoneAuthProvider.verifyPhoneNumber необходимо также предоставить экземпляр OnVerificationStateChangedCallbacks, который содержит реализации функций обратного вызова, обрабатывающих результаты запроса. Пример:

Kotlin

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

Обратные вызовы для подтверждения

В большинстве приложений вы реализуете обратные вызовы onVerificationCompleted, onVerificationFailed и onCodeSent. В зависимости от требований приложения вы также можете реализовать onCodeAutoRetrievalTimeOut.

onVerificationCompleted(PhoneAuthCredential)

Этот метод вызывается в двух случаях:

  • Мгновенное подтверждение. В некоторых случаях номер телефона можно подтвердить мгновенно, без отправки и ввода кода подтверждения.
  • Автоматическое получение. На некоторых устройствах сервисы Google Play могут автоматически обнаруживать входящие SMS с кодом подтверждения и выполнять проверку без участия пользователя. (Эта функция может быть недоступна у некоторых операторов связи.) Для этого используется SMS Retriever API, который добавляет в конец SMS-сообщения 11-символьный хеш.
В любом случае номер телефона пользователя будет успешно подтвержден, и вы сможете использовать объект PhoneAuthCredential, переданный в функцию обратного вызова, чтобы войти в аккаунт пользователя.

onVerificationFailed(FirebaseException)

Этот метод вызывается в ответ на недействительный запрос подтверждения, например если в запросе указан недействительный номер телефона или код подтверждения.

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

Необязательное поле. Этот метод вызывается после того, как код подтверждения был отправлен в SMS на указанный номер телефона.

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

onCodeAutoRetrievalTimeOut(String verificationId)

Необязательное поле. Этот метод вызывается после того, как истечет время ожидания, заданное для verifyPhoneNumber, и до того, как будет активирован onVerificationCompleted. На устройствах без SIM-карт этот метод вызывается сразу, поскольку автоматическое получение SMS невозможно.

Некоторые приложения блокируют ввод данных пользователем до истечения периода автоматической проверки, а затем показывают интерфейс, в котором предлагается ввести код подтверждения из SMS (не рекомендуется).

Создайте объект PhoneAuthCredential

После того как пользователь введет код подтверждения, отправленный Firebase на его телефон, создайте объект PhoneAuthCredential, используя код подтверждения и идентификатор подтверждения, который был передан в обратный вызов onCodeSent или onCodeAutoRetrievalTimeOut. (При вызове onVerificationCompleted вы получаете объект PhoneAuthCredential напрямую, поэтому этот шаг можно пропустить.)

Чтобы создать объект PhoneAuthCredential, вызовите метод PhoneAuthProvider.getCredential:

Kotlin

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

Войдите в аккаунт пользователя

После того как вы получите объект PhoneAuthCredential (в обратном вызове onVerificationCompleted или вызвав метод PhoneAuthProvider.getCredential), завершите процесс входа, передав объект PhoneAuthCredential в метод FirebaseAuth.signInWithCredential:

Kotlin

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .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, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

Тестирование с вымышленными номерами телефонов

Вы можете настроить вымышленные номера телефонов для разработки, используя консоль Firebase. Тестирование с вымышленными номерами телефонов дает следующие преимущества:

  • Проверьте аутентификацию по номеру телефона, не расходуя квоту на использование.
  • Проверять аутентификацию по номеру телефона без отправки SMS.
  • Проводить последовательные тесты с одним и тем же номером телефона без ограничений. Это снижает риск отклонения приложения при проверке в магазине, если проверяющий использует тот же номер телефона для тестирования.
  • Простое тестирование в средах разработки без дополнительных усилий, например возможность разрабатывать в симуляторе iOS или эмуляторе Android без сервисов Google Play.
  • Писать интеграционные тесты, не сталкиваясь с блокировками из-за проверок безопасности, которые обычно применяются к реальным номерам телефонов в рабочей среде.

Вымышленные номера телефонов должны соответствовать следующим требованиям:

  1. Убедитесь, что используемые номера телефонов вымышленные и не существуют в реальности. Firebase Authentication не позволяет использовать в качестве тестовых номеров существующие номера телефонов, которыми пользуются реальные пользователи. Один из вариантов – использовать в качестве тестовых номеров телефонов США номера с префиксом 555, например: +1 650-555-3434
  2. Номера телефонов должны иметь правильный формат, в том числе соответствовать требованиям к длине. Они проходят ту же проверку, что и номера реальных пользователей.
  3. Вы можете добавить до 10 номеров телефонов для разработки.
  4. Используйте сложные для подбора тестовые номера телефонов и коды и часто меняйте их.

Создание вымышленных номеров телефонов и кодов подтверждения

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Способ входа включите поставщика услуг входа Телефон, если вы ещё этого не сделали.
  3. Разверните раздел Номера телефонов для тестирования.
  4. Укажите номер телефона, который хотите проверить, например:+1 650-555-3434.
  5. Введите шестизначный код подтверждения для этого номера, например: 654321.
  6. Нажмите Добавить для каждого номера. При необходимости вы можете удалить номер телефона и его код, наведя указатель на нужную строку и нажав на значок корзины.

Ручное тестирование

Вы можете сразу начать использовать вымышленный номер телефона в своем приложении. Это позволяет выполнять ручное тестирование на этапах разработки без проблем с квотами или регулированием скорости. Вы также можете проводить тестирование непосредственно в симуляторе iOS или эмуляторе Android без установленных сервисов Google Play.

Когда вы указываете вымышленный номер телефона и отправляете код подтверждения, SMS не отправляется. Вместо этого вам нужно ввести ранее настроенный код подтверждения.

После входа создается пользователь Firebase с указанным номером телефона. У пользователя с виртуальным номером телефона те же свойства и поведение, что и у пользователя с реальным номером телефона. Он может использовать Realtime Database/Cloud Firestore и другие сервисы так же, как и другие пользователи. Токен идентификатора, созданный в ходе этого процесса, имеет ту же подпись, что и у реального пользователя с номером телефона.

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

Чтобы вручную запустить процесс reCAPTCHA для тестирования, используйте метод forceRecaptchaFlowForTesting().

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

Тестирование интеграции

Помимо ручного тестирования, Firebase Authentication предоставляет API, которые помогают писать интеграционные тесты для проверки аутентификации по номеру телефона. Эти API отключают проверку приложений, отменяя требование reCAPTCHA в веб-версии и беззвучные push-уведомления в iOS. Это позволяет автоматизировать тестирование в этих процессах и упрощает его реализацию. Кроме того, они позволяют тестировать мгновенную проверку на устройствах Android.

На устройстве Android вызовите setAppVerificationDisabledForTesting() до вызова signInWithPhoneNumber. Это автоматически отключает проверку приложения и позволяет передать номер телефона без ручного ввода. Даже если отключить Play Integrity и reCAPTCHA, войти в аккаунт с помощью реального номера телефона не получится. С этим API можно использовать только вымышленные номера телефонов.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

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

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

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

Когда вызывается функция verifyPhoneNumber, она напрямую активирует функцию onVerificationCompleted с помощью PhoneAuthCredential. Это работает только с вымышленными номерами телефонов.

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

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Дальнейшие действия

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

  • В своих приложениях вы можете получить основную информацию профиля пользователя из объекта FirebaseUser. Подробнее о том, как управлять пользователями…

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

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

Чтобы выйти из аккаунта пользователя, вызовите функцию signOut:

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();