Аутентификация в 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.9.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.0.1")
    }
  3. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это через консоль Firebase .
  4. Если вы еще не установили хеш SHA-1 для своего приложения в консоли Firebase , сделайте это. См. раздел «Аутентификация клиента» для получения информации о том, как найти хеш SHA-1 для вашего приложения.

Вопросы безопасности

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

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

Включите вход по номеру телефона для вашего проекта Firebase.

Для авторизации пользователей по SMS необходимо сначала включить метод авторизации по номеру телефона в вашем проекте Firebase:

  1. В консоли Firebase откройте раздел «Аутентификация» .
  2. На странице «Способ входа» включите способ входа по номеру телефона .
  3. Необязательно : на странице настроек задайте политику для регионов, в которые вы хотите разрешить или запретить отправку SMS-сообщений. Настройка региональной политики для SMS-сообщений поможет защитить ваши приложения от злоупотреблений, связанных с SMS.

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

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

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

    Чтобы использовать Play Integrity, если вы еще не указали отпечаток SHA-256 вашего приложения, сделайте это в настройках проекта в консоли Firebase . Подробную информацию о том, как получить отпечаток SHA-256 вашего приложения, см. в разделе «Аутентификация клиента» .

  • Проверка 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 оказался недействительным (в версиях Authentication SDK < 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 активности, метод 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-сообщение с подтверждением и выполнять проверку без участия пользователя. (Эта возможность может быть недоступна у некоторых операторов связи.) Для этого используется API SMS Retriever , который включает 11-символьный хеш в конце SMS-сообщения.
В любом случае, номер телефона пользователя успешно проверен, и вы можете использовать объект 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. На вкладке «Способ входа» включите оператора связи, если вы еще этого не сделали.
  3. Откройте раздел « Номера телефонов для тестирования аккордеонного меню».
  4. Укажите номер телефона, который вы хотите проверить, например: +1 650-555-3434 .
  5. Введите 6-значный проверочный код для этого конкретного номера, например: 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();