Autenticarse con Firebase en Android usando un número de teléfono

Puede utilizar Firebase Authentication para iniciar sesión en un usuario enviando un mensaje SMS al teléfono del usuario. El usuario inicia sesión utilizando un código de un solo uso contenido en el mensaje SMS.

La forma más sencilla de agregar el inicio de sesión con un número de teléfono a su aplicación es usar FirebaseUI , que incluye un widget de inicio de sesión directo que implementa flujos de inicio de sesión para el inicio de sesión con un número de teléfono, así como un inicio de sesión federado y basado en contraseña. -en. Este documento describe cómo implementar un flujo de inicio de sesión con un número de teléfono mediante el SDK de Firebase.

Antes de que empieces

  1. Si aún no lo has hecho, agrega Firebase a tu proyecto de Android .
  2. En el archivo Gradle de su módulo (nivel de aplicación) (generalmente <project>/<app-module>/build.gradle.kts o <project>/<app-module>/build.gradle ), agregue la dependencia para la autenticación de Firebase. biblioteca para Android. Recomendamos utilizar Firebase Android BoM para controlar el control de versiones de la biblioteca.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.3"))
    
        // 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")
    }
    

    Al usar Firebase Android BoM , su aplicación siempre usará versiones compatibles de las bibliotecas de Firebase Android.

    (Alternativa) Agregue dependencias de la biblioteca de Firebase sin usar la BoM

    Si elige no utilizar la BoM de Firebase, debe especificar cada versión de la biblioteca de Firebase en su línea de dependencia.

    Tenga en cuenta que si usa varias bibliotecas de Firebase en su aplicación, le recomendamos encarecidamente usar la BoM para administrar las versiones de la biblioteca, lo que garantiza que todas las versiones sean compatibles.

    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")
    }
    
    ¿Busca un módulo de biblioteca específico de Kotlin? A partir de octubre de 2023 (Firebase BoM 32.5.0) , tanto los desarrolladores de Kotlin como los de Java podrán depender del módulo de biblioteca principal (para más detalles, consulte las preguntas frecuentes sobre esta iniciativa ).
  3. Si aún no has conectado tu aplicación a tu proyecto de Firebase, hazlo desde Firebase console .
  4. Si aún no configuraste el hash SHA-1 de tu aplicación en Firebase console , hazlo. Consulte Autenticar a su cliente para obtener información sobre cómo encontrar el hash SHA-1 de su aplicación.

Preocupaciones de seguridad

La autenticación utilizando sólo un número de teléfono, si bien es conveniente, es menos segura que otros métodos disponibles, porque la posesión de un número de teléfono puede transferirse fácilmente entre usuarios. Además, en dispositivos con múltiples perfiles de usuario, cualquier usuario que pueda recibir mensajes SMS puede iniciar sesión en una cuenta utilizando el número de teléfono del dispositivo.

Si utiliza el inicio de sesión basado en un número de teléfono en su aplicación, debe ofrecerlo junto con métodos de inicio de sesión más seguros e informar a los usuarios sobre las ventajas y desventajas de seguridad que implica el uso del inicio de sesión por número de teléfono.

Habilite el inicio de sesión con número de teléfono para su proyecto de Firebase

Para iniciar sesión de usuarios mediante SMS, primero debes habilitar el método de inicio de sesión con número de teléfono para tu proyecto de Firebase:

  1. En Firebase console , abre la sección Autenticación .
  2. En la página Método de inicio de sesión , habilite el método de inicio de sesión por número de teléfono .

La cuota de solicitudes de inicio de sesión de números de teléfono de Firebase es lo suficientemente alta como para que la mayoría de las aplicaciones no se vean afectadas. Sin embargo, si necesita iniciar sesión en un volumen muy grande de usuarios con autenticación telefónica, es posible que deba actualizar su plan de precios. Vea la página de precios .

Habilitar la verificación de aplicaciones

Para utilizar la autenticación de número de teléfono, Firebase debe poder verificar que las solicitudes de inicio de sesión de número de teléfono provienen de su aplicación. Hay tres formas en que Firebase Authentication logra esto:

  • Play Integrity API : si un usuario tiene un dispositivo con los servicios de Google Play instalados y Firebase Authentication puede verificar que el dispositivo es legítimo con Play Integrity API , puede continuar con el inicio de sesión con el número de teléfono. La API Play Integrity se habilita en un proyecto propiedad de Google mediante Firebase Authentication, no en su proyecto. Esto no contribuye a ninguna cuota de API de Play Integrity en tu proyecto. El soporte de Play Integrity está disponible con el SDK de autenticación v21.2.0+ (Firebase BoM v31.4.0+).

    Para usar Play Integrity, si aún no has especificado la huella digital SHA-256 de tu aplicación, hazlo desde la configuración del proyecto de Firebase console. Consulte Autenticar a su cliente para obtener detalles sobre cómo obtener la huella digital SHA-256 de su aplicación.

  • Verificación reCAPTCHA : en caso de que no se pueda usar Play Integrity, como cuando un usuario tiene un dispositivo sin los servicios de Google Play instalados, Firebase Authentication utiliza una verificación reCAPTCHA para completar el flujo de inicio de sesión del teléfono. El desafío reCAPTCHA a menudo se puede completar sin que el usuario tenga que resolver nada. Tenga en cuenta que este flujo requiere que un SHA-1 esté asociado con su aplicación. Este flujo también requiere que su clave API no esté restringida o esté incluida en la lista de permitidos para PROJECT_ID .firebaseapp.com .

    Algunos escenarios en los que se activa reCAPTCHA:

    • Si el dispositivo del usuario final no tiene instalados los servicios de Google Play.
    • Si la aplicación no se distribuye a través de la tienda Google Play (en el SDK de autenticación v21.2.0+ ).
    • Si el token SafetyNet obtenido no era válido (en versiones del SDK de autenticación <v21.2.0).

    Cuando se utiliza SafetyNet o Play Integrity para la verificación de aplicaciones, el campo %APP_NAME% en la plantilla de SMS se completa con el nombre de la aplicación determinado en Google Play Store. En los escenarios donde se activa reCAPTCHA, %APP_NAME% se completa como PROJECT_ID .firebaseapp.com .

Puede forzar el flujo de verificación de reCAPTCHA con forceRecaptchaFlowForTesting Puede deshabilitar la verificación de la aplicación (cuando usa números de teléfono ficticios) usando setAppVerificationDisabledForTesting .

Solución de problemas

  • Error "Falta el estado inicial" al usar reCAPTCHA para la verificación de la aplicación

    Esto puede ocurrir cuando el flujo reCAPTCHA se completa exitosamente pero no redirige al usuario a la aplicación nativa. Si esto ocurre, se redirige al usuario a la URL alternativa PROJECT_ID .firebaseapp.com/__/auth/handler . En los navegadores Firefox, la apertura de enlaces de aplicaciones nativas está deshabilitada de forma predeterminada. Si ve el error anterior en Firefox, siga los pasos en Configurar Firefox para Android para abrir enlaces en aplicaciones nativas para habilitar la apertura de enlaces de aplicaciones.

Enviar un código de verificación al teléfono del usuario

Para iniciar el inicio de sesión con el número de teléfono, presente al usuario una interfaz que le solicite que escriba su número de teléfono. Los requisitos legales varían, pero como práctica recomendada y para establecer expectativas para sus usuarios, debe informarles que si utilizan el inicio de sesión por teléfono, es posible que reciban un mensaje SMS para verificación y se aplicarán tarifas estándar.

Luego, pasa su número de teléfono al método PhoneAuthProvider.verifyPhoneNumber para solicitar que Firebase verifique el número de teléfono del usuario. Por ejemplo:

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);     

El método verifyPhoneNumber es reentrante: si lo llama varias veces, como en el método onStart de una actividad, el método verifyPhoneNumber no enviará un segundo SMS a menos que se haya agotado el tiempo de espera de la solicitud original.

Puede utilizar este comportamiento para reanudar el proceso de inicio de sesión del número de teléfono si su aplicación se cierra antes de que el usuario pueda iniciar sesión (por ejemplo, mientras el usuario usa su aplicación de SMS). Después de llamar verifyPhoneNumber , establezca una marca que indique que la verificación está en curso. Luego, guarde el indicador en el método onSaveInstanceState de su actividad y restaure el indicador en onRestoreInstanceState . Finalmente, en el método onStart de su actividad, verifique si la verificación ya está en progreso y, de ser así, llame a verifyPhoneNumber nuevamente. Asegúrese de borrar la marca cuando la verificación se complete o falle (consulte Devoluciones de llamada de verificación ).

Para manejar fácilmente la rotación de la pantalla y otros casos de reinicio de la Actividad, pase su Actividad al método verifyPhoneNumber . Las devoluciones de llamada se desconectarán automáticamente cuando se detenga la actividad, por lo que puede escribir libremente el código de transición de la interfaz de usuario en los métodos de devolución de llamada.

El mensaje SMS enviado por Firebase también se puede localizar especificando el idioma de autenticación mediante el método setLanguageCode en su instancia de autenticación.

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();

Cuando llamas PhoneAuthProvider.verifyPhoneNumber , también debes proporcionar una instancia de OnVerificationStateChangedCallbacks , que contiene implementaciones de las funciones de devolución de llamada que manejan los resultados de la solicitud. Por ejemplo:

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;
    }
};

Devoluciones de llamada de verificación

En la mayoría de las aplicaciones, implementas las devoluciones de llamada onVerificationCompleted , onVerificationFailed y onCodeSent . También puedes implementar onCodeAutoRetrievalTimeOut , según los requisitos de tu aplicación.

onVerificationCompleted (PhoneAuthCredential)

Este método se llama en dos situaciones:

  • Verificación instantánea: en algunos casos el número de teléfono se puede verificar instantáneamente sin necesidad de enviar o ingresar un código de verificación.
  • Recuperación automática: en algunos dispositivos, los servicios de Google Play pueden detectar automáticamente el SMS de verificación entrante y realizar la verificación sin la acción del usuario. (Es posible que esta capacidad no esté disponible con algunos operadores). Esto utiliza la API SMS Retriever , que incluye un hash de 11 caracteres al final del mensaje SMS.
En cualquier caso, el número de teléfono del usuario se verificó correctamente y puede usar el objeto PhoneAuthCredential que se pasa a la devolución de llamada para iniciar sesión .

onVerificationFailed (FirebaseException)

Este método se llama en respuesta a una solicitud de verificación no válida, como una solicitud que especifica un número de teléfono o un código de verificación no válido.

onCodeSent (Id. de verificación de cadena, PhoneAuthProvider.ForceResendingToken)

Opcional. Este método se llama después de que el código de verificación se haya enviado por SMS al número de teléfono proporcionado.

Cuando se llama a este método, la mayoría de las aplicaciones muestran una interfaz de usuario que solicita al usuario que escriba el código de verificación del mensaje SMS. (Al mismo tiempo, es posible que la verificación automática se realice en segundo plano). Luego, después de que el usuario escriba el código de verificación, puede usar el código de verificación y el ID de verificación que se pasó al método para crear un objeto PhoneAuthCredential , que a su vez, puede utilizarlo para iniciar sesión como usuario. Sin embargo, algunas aplicaciones pueden esperar hasta que se llame a onCodeAutoRetrievalTimeOut antes de mostrar la interfaz de usuario del código de verificación (no recomendado).

onCodeAutoRetrievalTimeOut (Id. de verificación de cadena)

Opcional. Este método se llama después de que transcurra el tiempo de espera especificado para verifyPhoneNumber sin que onVerificationCompleted se active primero. En dispositivos sin tarjetas SIM, este método se llama inmediatamente porque la recuperación automática de SMS no es posible.

Algunas aplicaciones bloquean la entrada del usuario hasta que finaliza el período de verificación automática y solo entonces muestran una interfaz de usuario que solicita al usuario que escriba el código de verificación del mensaje SMS (no recomendado).

Crear un objeto PhoneAuthCredential

Después de que el usuario ingrese el código de verificación que Firebase envió al teléfono del usuario, cree un objeto PhoneAuthCredential usando el código de verificación y el ID de verificación que se pasó a la devolución de llamada onCodeSent o onCodeAutoRetrievalTimeOut . (Cuando se llama onVerificationCompleted , obtienes un objeto PhoneAuthCredential directamente, por lo que puedes omitir este paso).

Para crear el objeto PhoneAuthCredential , llame PhoneAuthProvider.getCredential :

Kotlin+KTX

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

Java

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

Iniciar sesión como usuario

Después de obtener un objeto PhoneAuthCredential , ya sea en la devolución de llamada onVerificationCompleted o llamando PhoneAuthProvider.getCredential , completa el flujo de inicio de sesión pasando el objeto PhoneAuthCredential a 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
                        }
                    }
                }
            });
}

Prueba con números de teléfono ficticios

Puedes configurar números de teléfono ficticios para el desarrollo a través de Firebase console. Las pruebas con números de teléfono ficticios brindan estos beneficios:

  • Pruebe la autenticación del número de teléfono sin consumir su cuota de uso.
  • Pruebe la autenticación del número de teléfono sin enviar un mensaje SMS real.
  • Realiza pruebas consecutivas con el mismo número de teléfono sin que te limiten. Esto minimiza el riesgo de rechazo durante el proceso de revisión de la tienda de aplicaciones si el revisor utiliza el mismo número de teléfono para la prueba.
  • Pruebe fácilmente en entornos de desarrollo sin ningún esfuerzo adicional, como la capacidad de desarrollar en un simulador de iOS o un emulador de Android sin los servicios de Google Play.
  • Escriba pruebas de integración sin verse bloqueado por controles de seguridad que normalmente se aplican a números de teléfono reales en un entorno de producción.

Los números de teléfono ficticios deben cumplir estos requisitos:

  1. Asegúrese de utilizar números de teléfono que sean realmente ficticios y que no existan ya. Firebase Authentication no le permite configurar números de teléfono existentes utilizados por usuarios reales como números de prueba. Una opción es utilizar números con prefijo 555 como números de teléfono de prueba de EE. UU., por ejemplo: +1 650-555-3434
  2. Los números de teléfono deben tener el formato correcto según la longitud y otras restricciones. Seguirán pasando por la misma validación que el número de teléfono de un usuario real.
  3. Puede agregar hasta 10 números de teléfono para el desarrollo.
  4. Utilice números/códigos de teléfono de prueba que sean difíciles de adivinar y cámbielos con frecuencia.

Crea números de teléfono ficticios y códigos de verificación.

  1. En Firebase console , abre la sección Autenticación .
  2. En la pestaña Método de inicio de sesión , habilite el Proveedor de teléfono si aún no lo ha hecho.
  3. Abra el menú Números de teléfono para probar el acordeón.
  4. Proporcione el número de teléfono que desea probar, por ejemplo: +1 650-555-3434 .
  5. Proporcione el código de verificación de 6 dígitos para ese número específico, por ejemplo: 654321 .
  6. Añade el número. Si es necesario, puedes eliminar el número de teléfono y su código colocando el cursor sobre la fila correspondiente y haciendo clic en el icono de la papelera.

Prueba manual

Puede comenzar a usar directamente un número de teléfono ficticio en su aplicación. Esto le permite realizar pruebas manuales durante las etapas de desarrollo sin tener problemas de cuotas ni limitaciones. También puedes realizar la prueba directamente desde un simulador de iOS o un emulador de Android sin tener instalados los servicios de Google Play.

Cuando proporciona el número de teléfono ficticio y envía el código de verificación, no se envía ningún SMS real. En su lugar, debe proporcionar el código de verificación configurado previamente para completar el inicio de sesión.

Al finalizar el inicio de sesión, se crea un usuario de Firebase con ese número de teléfono. El usuario tiene el mismo comportamiento y propiedades que un usuario de número de teléfono real y puede acceder a Realtime Database/Cloud Firestore y otros servicios de la misma manera. El token de identificación acuñado durante este proceso tiene la misma firma que un usuario de número de teléfono real.

Otra opción es establecer un rol de prueba mediante reclamos personalizados para estos usuarios para diferenciarlos como usuarios falsos si desea restringir aún más el acceso.

Para activar manualmente el flujo reCAPTCHA para realizar pruebas, utilice el método forceRecaptchaFlowForTesting() .

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

Pruebas de integración

Además de las pruebas manuales, Firebase Authentication proporciona API para ayudar a escribir pruebas de integración para las pruebas de autenticación telefónica. Estas API desactivan la verificación de aplicaciones al desactivar el requisito de reCAPTCHA en la web y las notificaciones push silenciosas en iOS. Esto hace que las pruebas de automatización sean posibles en estos flujos y más fáciles de implementar. Además, ayudan a brindar la capacidad de probar flujos de verificación instantánea en Android.

En Android, llame setAppVerificationDisabledForTesting() antes de la llamada signInWithPhoneNumber . Esto deshabilita la verificación de la aplicación automáticamente, lo que le permite pasar el número de teléfono sin resolverlo manualmente. Aunque Play Integrity y reCAPTCHA están deshabilitados, el uso de un número de teléfono real no permitirá completar el inicio de sesión. Solo se pueden usar números de teléfono ficticios con esta API.

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

Llamar a verifyPhoneNumber con un número ficticio activa la devolución de llamada onCodeSent , en la que deberás proporcionar el código de verificación correspondiente. Esto permite realizar pruebas en emuladores de 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)

Además, puede probar los flujos de recuperación automática en Android configurando el número ficticio y su código de verificación correspondiente para la recuperación automática llamando a setAutoRetrievedSmsCodeForPhoneNumber .

Cuando se llama verifyPhoneNumber , activa onVerificationCompleted directamente con PhoneAuthCredential . Esto sólo funciona con números de teléfono ficticios.

Asegúrese de que esto esté deshabilitado y que no haya números de teléfono ficticios codificados en su aplicación cuando la publique en la tienda 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)

Próximos pasos

Después de que un usuario inicia sesión por primera vez, se crea una nueva cuenta de usuario y se vincula a las credenciales (es decir, el nombre de usuario y la contraseña, el número de teléfono o la información del proveedor de autenticación) con las que el usuario inició sesión. Esta nueva cuenta se almacena como parte de su proyecto de Firebase y se puede usar para identificar a un usuario en cada aplicación de su proyecto, independientemente de cómo inicie sesión el usuario.

  • En tus aplicaciones, puedes obtener la información básica del perfil del usuario desde el objeto FirebaseUser . Consulte Administrar usuarios .

  • En las reglas de seguridad de Firebase Realtime Database y Cloud Storage, puede obtener el ID de usuario único del usuario que inició sesión a partir de la variable auth y usarlo para controlar a qué datos puede acceder un usuario.

Puede permitir que los usuarios inicien sesión en su aplicación utilizando múltiples proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente.

Para cerrar la sesión de un usuario, llame signOut :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();