Аутентификация в Firebase на Android по номеру телефона

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

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

Прежде чем вы начнете

  1. Если вы еще этого не сделали, добавьте Firebase в свой проект Android .
  2. В файле Gradle вашего модуля (на уровне приложения) (обычно <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle ) добавьте зависимость для аутентификации Firebase. библиотека для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотеки.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.4"))
    
        // 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, вы должны указать каждую версию библиотеки 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:22.3.1")
    }
    
    Ищете библиотечный модуль, специфичный для Kotlin? Начиная с октября 2023 года (Firebase BoM 32.5.0) от основного модуля библиотеки могут зависеть как разработчики Kotlin, так и Java (подробнее см. FAQ по этой инициативе ).
  3. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .
  4. Если вы еще не установили хэш SHA-1 своего приложения в консоли Firebase , сделайте это. См. раздел «Аутентификация вашего клиента» для получения информации о поиске хеша SHA-1 вашего приложения.

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

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

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

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

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

  1. В консоли Firebase откройте раздел Аутентификация .
  2. На странице «Метод входа» включите метод входа по номеру телефона .

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

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

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

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

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

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

    Некоторые сценарии, в которых срабатывает reCAPTCHA:

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

    Если для проверки приложения используется SafetyNet или Play Integrity, поле %APP_NAME% в шаблоне SMS заполняется именем приложения, определенным из магазина Google Play. В сценариях, где срабатывает 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+KTX

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 . Обязательно снимите флаг, когда проверка завершится или завершится неудачей (см. Обратные вызовы проверки ).

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

SMS-сообщение, отправленное Firebase, также можно локализовать, указав язык аутентификации с помощью метода setLanguageCode в вашем экземпляре Auth.

Kotlin+KTX

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+KTX

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 (StringverificationId, PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrivalTimeOut (идентификатор проверки строки)

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

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

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

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

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

Kotlin+KTX

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

Java

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

Войти в систему

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

Kotlin+KTX

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 не позволяет вам устанавливать существующие номера телефонов, используемые реальными пользователями, в качестве тестовых номеров. Один из вариантов — использовать номера с префиксом 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 с этим номером телефона. Пользователь имеет такое же поведение и свойства, что и пользователь реального номера телефона, и может получить доступ к базе данных реального времени/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+KTX

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+KTX

// 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();