Conecte su aplicación al emulador de autenticación

Antes de usar el emulador de autenticación con su aplicación, asegúrese de comprender el flujo de trabajo general de Firebase Local Emulator Suite , de instalar y configurar Local Emulator Suite y de revisar sus comandos CLI .

Este tema supone que ya estás familiarizado con el desarrollo de soluciones de Firebase Authentication para producción. Si es necesario, revise la documentación de su combinación de plataforma y técnica de autenticación .

¿Qué puedo hacer con el emulador de autenticación?

El emulador de autenticación proporciona una emulación local de alta fidelidad de los servicios de Firebase Authentication y proporciona gran parte de la funcionalidad que se encuentra en la producción de Firebase Authentication . Junto con las plataformas Apple, Android y los SDK de Web Firebase, el emulador te permite:

  • Cree, actualice y administre cuentas de usuario emuladas para probar la autenticación de correo electrónico/contraseña, número de teléfono/SMS, multifactor de SMS y de proveedores de identidad de terceros (por ejemplo, Google).
  • Ver y editar usuarios emulados
  • Prototipos de sistemas de autenticación de tokens personalizados
  • Verifique los mensajes relacionados con la autenticación en la pestaña Registros de la interfaz de usuario del emulador.

Elige un proyecto de Firebase

Firebase Local Emulator Suite emula productos para un único proyecto de Firebase.

Para seleccionar el proyecto a usar, antes de iniciar los emuladores, en la CLI ejecute firebase use en su directorio de trabajo. O puede pasar el indicador --project a cada comando del emulador.

Local Emulator Suite admite la emulación de proyectos reales de Firebase y proyectos de demostración .

Tipo de proyecto Características Usar con emuladores
Real

Un proyecto real de Firebase es uno que usted creó y configuró (muy probablemente a través de la consola de Firebase).

Los proyectos reales tienen recursos activos, como instancias de bases de datos, depósitos de almacenamiento, funciones o cualquier otro recurso que configure para ese proyecto de Firebase.

Cuando trabajas con proyectos reales de Firebase, puedes ejecutar emuladores para cualquiera o todos los productos compatibles.

Para cualquier producto que no esté emulando, sus aplicaciones y código interactuarán con el recurso activo (instancia de base de datos, depósito de almacenamiento, función, etc.).

Manifestación

Un proyecto de demostración de Firebase no tiene una configuración real de Firebase ni recursos activos. Por lo general, se accede a estos proyectos a través de codelabs u otros tutoriales.

Los ID de proyecto para proyectos de demostración tienen el prefijo demo- .

Cuando trabajas con proyectos de demostración de Firebase, tus aplicaciones y código interactúan solo con emuladores. Si su aplicación intenta interactuar con un recurso para el cual no se está ejecutando un emulador, ese código fallará.

Le recomendamos que utilice proyectos de demostración siempre que sea posible. Beneficios incluidos:

  • Configuración más sencilla, ya que puedes ejecutar los emuladores sin tener que crear un proyecto de Firebase.
  • Mayor seguridad, ya que si su código invoca accidentalmente recursos (de producción) no emulados, no hay posibilidad de cambio de datos, uso y facturación.
  • Mejor soporte fuera de línea, ya que no es necesario acceder a Internet para descargar la configuración del SDK.

Instrumenta tu aplicación para hablar con el emulador

Android, iOS y SDK web

Configure su configuración en la aplicación o clases de prueba para interactuar con el emulador de autenticación de la siguiente manera.

Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Rápido
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)

Web modular API

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://127.0.0.1:9099");

Web namespaced API

const auth = firebase.auth();
auth.useEmulator("http://127.0.0.1:9099");

No se necesita configuración adicional para crear prototipos y probar interacciones entre la autenticación y las funciones de la nube o las reglas de seguridad de Firebase para Cloud Firestore o Realtime Database. Cuando el emulador de autenticación está configurado y se están ejecutando otros emuladores, funcionan juntos automáticamente.

SDK de administrador

Los SDK de Firebase Admin se conectan automáticamente al emulador de autenticación cuando se configura la variable de entorno FIREBASE_AUTH_EMULATOR_HOST .

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Tenga en cuenta que el emulador de Cloud Functions reconoce automáticamente el emulador de autenticación, por lo que puede omitir este paso al probar integraciones entre Cloud Functions y los emuladores de autenticación. La variable de entorno se configurará automáticamente para el SDK de administración en Cloud Functions.

Con la variable de entorno configurada, los SDK de Firebase Admin aceptarán tokens de identificación no firmados y cookies de sesión emitidas por el emulador de autenticación (a través de los métodos verifyIdToken y createSessionCookie respectivamente) para facilitar el desarrollo y las pruebas locales. Asegúrese de no configurar la variable de entorno en producción.

Si desea que su código Admin SDK se conecte a un emulador compartido que se ejecuta en otro entorno, deberá especificar el mismo ID de proyecto que configuró mediante Firebase CLI . Puede pasar un ID de proyecto para initializeApp directamente o configurar la variable de entorno GCLOUD_PROJECT .

SDK de administración de Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variable ambiental
export GCLOUD_PROJECT="your-project-id"

Fichas de identificación

Por razones de seguridad, el emulador de autenticación emite tokens de identificación sin firmar , que solo son aceptados por otros emuladores de Firebase o por el SDK de administrador de Firebase cuando están configurados . Estos tokens serán rechazados por los servicios de producción de Firebase o el SDK de Firebase Admin que se ejecuta en modo de producción (por ejemplo, el comportamiento predeterminado sin los pasos de configuración descritos anteriormente).

Inicia el emulador

Puede utilizar el emulador de autenticación de forma interactiva a través de la interfaz de usuario de Emulator Suite y de forma no interactiva a través de su interfaz REST local. Las siguientes secciones cubren casos de uso interactivos y no interactivos.

Para iniciar el emulador de autenticación, su interfaz REST y la interfaz de usuario de Emulator Suite, ejecute:

firebase emulators:start

Para la autenticación anónima , su aplicación puede ejercer la lógica de inicio de sesión para su plataforma ( iOS , Android , web ).

Para la autenticación de correo electrónico/contraseña , puede comenzar a crear prototipos agregando cuentas de usuario al emulador de autenticación desde su aplicación usando los métodos del SDK de autenticación o usando la interfaz de usuario de Emulator Suite.

  1. En la interfaz de usuario de Emulator Suite, haga clic en la pestaña Autenticación .
  2. Haga clic en el botón Agregar usuario .
  3. Siga el asistente de creación de cuentas de usuario, completando los campos de autenticación de correo electrónico.

Con un usuario de prueba creado, su aplicación puede iniciar y cerrar sesión del usuario con la lógica del SDK para su plataforma ( iOS , Android , web ).

Para probar la verificación/inicio de sesión de correo electrónico con flujos de enlaces de correo electrónico, el emulador imprime una URL en la terminal en la que se ejecutó firebase emulators:start .

i  To verify the email address customer@ex.com, follow this link:
http://127.0.0.1:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key

Pegue el enlace en su navegador para simular el evento de verificación y verifique si la verificación se realizó correctamente.

{
  "authEmulator": {
    "success": "The email has been successfully verified.",
    "email": "customer@example.com"
  }
}

Para probar el restablecimiento de contraseñas, el emulador imprime una URL similar, incluido un parámetro newPassword (que puede cambiar según sea necesario), en el terminal.

http://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD

Pruebas no interactivas

En lugar de utilizar la interfaz de usuario de Emulator Suite o el código de cliente para administrar cuentas de usuario de correo electrónico/contraseña, puede escribir scripts de configuración de prueba que llamen a las API REST para crear y eliminar cuentas de usuario y recuperar códigos de verificación de correo electrónico fuera de banda para completar la verificación de correo electrónico del emulador. URL. Esto mantiene la plataforma y el código de prueba separados y le permite realizar pruebas de forma no interactiva.

Para flujos de prueba de contraseñas y correo electrónico no interactivos, la secuencia típica es la siguiente.

  1. Cree usuarios con el punto final REST de registro de autenticación.
  2. Registre a los usuarios utilizando los correos electrónicos y contraseñas para realizar pruebas.
  3. Si corresponde a sus pruebas, obtenga los códigos de verificación de correo electrónico fuera de banda disponibles desde el punto final REST específico del emulador .
  4. Vacíe los registros de usuario con el punto final REST específico del emulador para borrar datos.

Autenticación por teléfono/SMS emulada

Para la autenticación telefónica, el emulador de autenticación no admite:

  • Flujos reCAPTCHA y APN. Una vez configurados para interactuar con el emulador, los SDK del cliente desactivan estos métodos de verificación de una manera similar a la descrita para las pruebas de integración ( iOS , Android , web ).
  • Pruebe números de teléfono con códigos preconfigurados en Firebase console.

Por lo demás, en términos de código de cliente, el flujo de autenticación por teléfono/SMS es idéntico al descrito para producción ( iOS , Android , web ).

Usando la interfaz de usuario de Emulator Suite:

  1. En la interfaz de usuario de Emulator Suite, haga clic en la pestaña Autenticación .
  2. Haga clic en el botón Agregar usuario .
  3. Siga el asistente de creación de cuentas de usuario, completando los campos de autenticación del teléfono.

Sin embargo, para los flujos de autenticación telefónica, el emulador NO activará la entrega de ningún mensaje de texto, ya que contactar a un operador está fuera del alcance y no es amigable para las pruebas locales. En su lugar, el emulador imprime el código que se habría enviado por SMS al mismo terminal en el que ejecutó firebase emulators:start ; Ingrese este código en la aplicación para simular que los usuarios revisan sus mensajes de texto.

Pruebas no interactivas

Para pruebas de autenticación telefónica no interactivas, utilice la API REST del emulador de autenticación para recuperar los códigos SMS disponibles. Tenga en cuenta que el código es diferente cada vez que inicia el flujo.

La secuencia típica es la siguiente.

  1. Llame a la plataforma signInWithPhoneNumber para iniciar el proceso de verificación.
  2. Recupere el código de verificación utilizando el punto final REST específico del emulador .
  3. Llame confirmationResult.confirm(code) como de costumbre con el código de verificación.

SMS multifactor

El emulador de autenticación admite la creación de prototipos y las pruebas de los flujos de autenticación multifactor (MFA) de SMS disponibles en producción para iOS , Android y web .

Cuando agrega un usuario simulado al emulador, puede habilitar MFA y configurar uno o más números de teléfono a los que se enviarán mensajes SMS de segundo factor. Los mensajes se envían al mismo terminal en el que ejecutó firebase emulators:start y están disponibles desde la interfaz REST.

Autenticación de proveedor de identidad de terceros (IDP) emulada

El emulador de autenticación le permite probar muchos flujos de autenticación de terceros en sus aplicaciones web, iOS o Android sin cambios en el código de producción. Para ver ejemplos de flujos de autenticación, consulte la documentación para conocer varias combinaciones de proveedores y plataformas que puede utilizar en su aplicación .

En términos generales, puedes usar el SDK de Firebase para autenticarte de dos maneras:

  • Su aplicación permite que el SDK maneje todo el proceso de un extremo a otro, incluidas todas las interacciones con proveedores de IDP externos para recuperar credenciales.
  • Su aplicación recupera manualmente las credenciales de un proveedor externo utilizando el SDK de esa parte y pasa esas credenciales al SDK de autenticación.

Nuevamente, verifique el enlace de documentación anterior y asegúrese de estar familiarizado con el flujo (recuperación de credenciales administrada por Firebase SDK o manual) que desee utilizar. El emulador de autenticación admite pruebas de cualquiera de los enfoques.

Prueba de flujos de IDP impulsados ​​por el SDK de Firebase

Si su aplicación utiliza cualquier flujo de extremo a extremo del SDK de Firebase, como OAuthProvider para iniciar sesión con Microsoft, GitHub o Yahoo, para pruebas interactivas, el emulador de autenticación ofrece una versión local de la página de inicio de sesión correspondiente para ayudarlo a realizar pruebas. autenticación desde aplicaciones web que llaman al método signinWithPopup o signInWithRedirect . Esta página de inicio de sesión local también aparece en aplicaciones móviles, representada por la biblioteca de vistas web de su plataforma.

El emulador crea credenciales y cuentas de usuario de terceros simuladas según sea necesario a medida que avanzan los flujos.

Prueba de flujos de IDP con recuperación manual de credenciales

Si utiliza técnicas de inicio de sesión "manuales" y llama al método signInWithCredentials de su plataforma, entonces, como de costumbre, su aplicación solicitará un inicio de sesión real de terceros y recuperará credenciales reales de terceros.

Tenga en cuenta que el emulador solo admite la autenticación signInWithCredential para las credenciales recuperadas de Google Sign-In, Apple y otros proveedores que utilizan tokens de identificación implementados como tokens web JSON (JWT). No se admiten tokens de acceso (por ejemplo, los proporcionados por Facebook o Twitter, que no son JWT). La siguiente sección analiza una alternativa en estos casos.

Pruebas no interactivas

Un enfoque para las pruebas no interactivas es automatizar los clics de los usuarios en la página de inicio de sesión proporcionada por el emulador. Para aplicaciones web, utilice una interfaz de control como WebDriver. Para dispositivos móviles, utilice las herramientas de prueba de UI de su plataforma, como Espresso o Xcode.

Alternativamente, puede actualizar su código para usar signInWithCredential (por ejemplo, en una rama de código) y usar un flujo de autenticación de token con tokens de identificación simulados para cuentas en lugar de credenciales reales.

  1. Vuelva a cablear o comente la parte de su código que recupera idTokens del IDP; esto elimina la necesidad de ingresar nombres de usuario y contraseñas reales durante sus pruebas y libera sus pruebas de cuotas API y límites de velocidad en el IDP.
  2. En segundo lugar, utilice una cadena JSON literal en lugar del token de signInWithCredential . Usando el SDK web como ejemplo, puede cambiar el código a:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Cuando se usa con el emulador, este código autenticará exitosamente a un usuario con correo electrónico foo@example.com en Google. Piense en el subcampo como una clave principal, que se puede cambiar a cualquier cadena, burlándose del inicio de sesión de diferentes usuarios. Puede reemplazar firebase.auth.GoogleAuthProvider con, por ejemplo, new firebase.auth.OAuthProvider('yahoo.com') o cualquier otro ID de proveedor que desee simular.

Autenticación de token personalizado emulado

El emulador de autenticación maneja la autenticación con tokens web JSON personalizados mediante llamadas al método signInWithCustomToken en plataformas compatibles, como se describe en la documentación de autenticación de producción .

En qué se diferencia el emulador de autenticación de la producción

El emulador de Firebase Authentication simula muchas características del producto de producción. Sin embargo, dado que cualquier tipo de sistema de autenticación depende en gran medida de la seguridad en múltiples niveles (dispositivo, proveedores externos, Firebase, etc.), es difícil para el emulador recrear adecuadamente todos los flujos.

Gestión de identidades y accesos en la nube

Firebase Emulator Suite no intenta replicar ni respetar ningún comportamiento relacionado con IAM para su ejecución. Los emuladores cumplen con las reglas de seguridad de Firebase proporcionadas, pero en situaciones en las que normalmente se usaría IAM, por ejemplo, para configurar Cloud Functions que invocan la cuenta de servicio y, por lo tanto, los permisos, el emulador no es configurable y usará la cuenta disponible globalmente en su máquina de desarrollador. similar a ejecutar un script local directamente.

Dado que en las plataformas móviles, el inicio de sesión mediante enlace de correo electrónico se basa en Firebase Dynamic Links, todos esos enlaces se abrirán en la plataforma web (móvil).

Inicio de sesión de terceros

Para los flujos de inicio de sesión de terceros, Firebase Authentication se basa en credenciales seguras de proveedores externos como Twitter y Github.

El emulador de autenticación acepta credenciales reales de proveedores de OpenID Connect como Google y Apple. No se admiten credenciales de proveedores que no sean de OpenID Connect.

Inicio de sesión por correo electrónico/SMS

En las aplicaciones de producción, los flujos de inicio de sesión por correo electrónico y SMS implican una operación asincrónica en la que el usuario verifica un mensaje recibido e ingresa un código de inicio de sesión en una interfaz de inicio de sesión. El emulador de autenticación no envía ningún correo electrónico ni mensaje SMS, pero, como se describió anteriormente , genera códigos de inicio de sesión y los envía al terminal para usarlos en las pruebas.

El emulador no admite la capacidad de definir números de teléfono de prueba con códigos de inicio de sesión fijos, como se puede hacer usando la consola Firebase.

Autenticación de token personalizado

El emulador de autenticación no valida la firma ni la caducidad de los tokens personalizados. Esto le permite utilizar tokens hechos a mano y reutilizarlos indefinidamente en escenarios de creación de prototipos y pruebas.

Limitación de tarifas / anti-abuso

El emulador de autenticación no replica funciones anti-abuso ni que limitan la tasa de producción.

Funciones de bloqueo

En producción, los usuarios se escriben en el almacenamiento una vez después de que se activan los eventos beforeCreate y beforeSignIn . Sin embargo, debido a limitaciones técnicas, el emulador de autenticación escribe en la tienda dos veces, una después de la creación del usuario y otra después del inicio de sesión. Esto significa que para los nuevos usuarios, pueden llamar exitosamente getAuth().getUser() en beforeSignIn en el emulador de autenticación, pero encontrarían un error al hacerlo en producción.

¿Qué sigue?