Как аутентифицироваться в 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:35.1.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:25.0.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 настройте правила.

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

Чтобы использовать аутентификацию по номеру телефона, 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 ниже 21.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 операции, метод 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.
  • Выполняйте последовательные тесты с одним и тем же номером телефона без ограничений. Это снижает риск отклонения приложения во время проверки в App Store, если проверяющий использует тот же номер телефона для тестирования.
  • Простое тестирование в средах разработки, например в симуляторе iOS или эмуляторе Android без сервисов Google Play.
  • Проводить интеграционные тесты, не сталкиваясь с проверками безопасности, которые обычно применяются к реальным номерам телефонов в рабочей среде.

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

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

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

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Sign-in method (Способ входа) включите поставщика входа Phone (Телефон), если вы ещё этого не сделали.
  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();