Conecta tu app al emulador de Authentication

Antes de usar el emulador de Authentication con tu app, asegúrate de comprender el flujo de trabajo general de Firebase Local Emulator Suite, así como de instalar y configurar Local Emulator Suite y revisar sus comandos de la CLI.

En este tema, se supone que ya sabes desarrollar soluciones de Firebase Authentication para producción. Si es necesario, revisa la documentación correspondiente a tu combinación de plataforma y técnica de autenticación.

¿Qué puedo hacer con el emulador de Authentication?

El emulador de Authentication proporciona una emulación local de alta fidelidad de los servicios de Firebase Authentication y brinda gran parte de las funciones disponibles en la versión para producción de Firebase Authentication. Si vinculas el emulador con los SDK de Firebase para Android, las plataformas de Apple y la Web, podrás hacer lo siguiente:

  • Crear, actualizar y administrar cuentas de usuario emuladas para probar la autenticación mediante correo electrónico y contraseña, número de teléfono y SMS, de varios factores mediante SMS y proveedores de identidad de terceros (como Google)
  • Ver y editar los usuarios emulados
  • Crear prototipos de sistemas de autenticación de tokens personalizados
  • Verificar los mensajes relacionados con la autenticación en la pestaña Registros de la IU del emulador

Elige un proyecto de Firebase

Firebase Local Emulator Suite emula los productos para un solo proyecto de Firebase.

Para seleccionar el proyecto que quieres usar, ejecuta firebase use en la CLI en tu directorio de trabajo antes de iniciar los emuladores. También puedes pasar la marca --project a cada comando del emulador.

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

Tipo de proyecto Características Uso con emuladores
Real

Los proyectos de Firebase reales son aquellos que creaste y configuraste (probablemente mediante Firebase console).

Los proyectos reales tienen recursos activos, como instancias de bases de datos, buckets de almacenamiento, funciones o cualquier otro recurso que hayas configurado para ese proyecto de Firebase.

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

Si se trata de un producto que no estás emulando, tus apps y código interactuarán con los recursos activos (instancias de bases de datos, bucket de almacenamiento, función, etcétera).

Demostración

Los proyectos de demostración de Firebase no tienen una configuración real de Firebase ni recursos activos. Por lo general, se accede a estos proyectos mediante codelabs o algún otro instructivo.

Los IDs de los proyectos de demostración tienen el prefijo demo-.

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

Te recomendamos que uses proyectos de demostración siempre que sea posible. Estos son algunos de los beneficios:

  • Configuración más sencilla, ya que puedes ejecutar los emuladores sin crear un proyecto de Firebase
  • Mayor seguridad, ya que, si tu código invoca de forma accidental recursos no emulados (de producción), no hay posibilidad de que se modifiquen los datos, el uso ni la facturación
  • Mejor soporte sin conexión, ya que no es necesario acceder a Internet para descargar la configuración del SDK

Instrumenta la app para que se comunique con el emulador

SDK para Android, iOS y la Web

Configura la app o las clases de prueba para que interactúen con el emulador de Authentication de la siguiente manera.

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

API modular web

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

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

API con espacio de nombres web

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 Authentication y Cloud Functions o las reglas de seguridad de Firebase para Cloud Firestore o Realtime Database. Cuando se configura el emulador de Authentication y se ejecutan otros emuladores, estos funcionan automáticamente en conjunto.

SDK de Admin

Los SDK de Firebase Admin se conectan automáticamente al emulador de Authentication cuando se establece la variable de entorno FIREBASE_AUTH_EMULATOR_HOST.

export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"

Ten en cuenta que el emulador de Cloud Functions reconoce de forma automática el emulador de Authentication, por lo que puedes omitir este paso cuando pruebes las integraciones entre ambos emuladores. La variable de entorno se configurará automáticamente para el SDK de Admin en Cloud Functions.

Con la variable de entorno establecida, los SDK de Firebase Admin aceptarán tokens de ID sin firma y cookies de sesión emitidas por el emulador de Authentication (a través de los métodos verifyIdToken y createSessionCookie, respectivamente), para facilitar el desarrollo y las pruebas locales. Asegúrate de no establecer la variable de entorno en producción.

Si quieres que el código del SDK de Admin se conecte a un emulador compartido que se ejecuta en otro entorno, deberás especificar el mismo ID del proyecto que configuraste con Firebase CLI. Podrás pasar el ID del proyecto directamente a initializeApp o configurar la variable de entorno GCLOUD_PROJECT.

SDK de Admin de Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variable de entorno
export GCLOUD_PROJECT="your-project-id"

Tokens de ID

Por motivos de seguridad, el emulador de Authentication emite tokens de ID sin firmar que solo aceptan otros emuladores de Firebase o el SDK de Firebase Admin cuando se configura. Los servicios de Firebase o el SDK de Firebase Admin que se ejecuten en modo de producción rechazarán estos tokens (p. ej., el comportamiento predeterminado sin los pasos de configuración descritos anteriormente).

Inicia el emulador

Puedes usar el emulador de Authentication de forma interactiva con la IU de Emulator Suite y de forma no interactiva mediante su interfaz de REST local. En las siguientes secciones, se abordan casos de uso interactivos y no interactivos.

Para iniciar el emulador de Authentication, su interfaz de REST y la IU del Emulator Suite, ejecuta lo siguiente:

firebase emulators:start

En el caso de la autenticación anónima, tu app puede ejercer la lógica de acceso en tu plataforma (iOS, Android o la Web).

En el caso de la autenticación con correo electrónico y contraseña, puedes comenzar el prototipado con solo agregar cuentas de usuario al emulador de Authentication desde tu app mediante los métodos del SDK de Authentication o la IU de Emulator Suite.

  1. En la IU de Emulator Suite, haz clic en la pestaña Authentication.
  2. Haz clic en el botón Agregar usuario.
  3. Sigue el asistente de creación de cuentas de usuario y completa los campos de autenticación con correo electrónico.

Una vez que hayas creado un usuario de prueba, tu app puede permitir que este acceda a su cuenta y salga de ella con la lógica del SDK para tu plataforma (iOS, Android y la Web).

Para probar los flujos de verificación por correo electrónico o acceso con vínculos de correo electrónico, el emulador imprime una URL en la terminal en 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

Pega el vínculo en tu navegador para simular el evento de verificación y comprueba si 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 en la terminal una URL similar con un parámetro newPassword (que puedes cambiar según sea necesario).

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 vez de usar la IU de Emulator Suite o el código del cliente para administrar cuentas de usuario con correo electrónico y contraseña, puedes escribir secuencias de comandos de configuración de prueba que llamen a las APIs de REST para crear y borrar cuentas de usuario, y recuperar códigos de verificación por correo electrónico fuera de banda para propagar la URL de verificación por correo electrónico del emulador. De este modo, se mantienen separados el código de la plataforma y el de pruebas, y puedes realizar pruebas no interactivas.

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

  1. Crea usuarios con el extremo de REST signUp de Authentication.
  2. Permite que los usuarios accedan mediante correos electrónicos y contraseñas para realizar pruebas.
  3. Si es pertinente para tus pruebas, recupera los códigos de verificación por correo electrónico fuera de banda disponibles del extremo de REST específico del emulador.
  4. Limpia los registros de los usuarios con el extremo de REST específico del emulador para borrar los datos.

Autenticación emulada por teléfono y SMS

Para la autenticación por teléfono, el emulador de Authentication no admite lo siguiente:

  • Flujos de reCAPTCHA y APN. Una vez que están configurados para interactuar con el emulador, los SDK de cliente inhabilitan estos métodos de verificación de manera similar a la que se describe para las pruebas de integración (iOS, Android y la Web)
  • Pruebas de números de teléfono con códigos preconfigurados en Firebase console

Fuera de esas situaciones, en términos del código de cliente, el flujo de autenticación por teléfono o SMS es idéntico al que se describe para producción (iOS, Android y la Web).

Con la IU de Emulator Suite, haz lo siguiente:

  1. En la IU de Emulator Suite, haz clic en la pestaña Authentication.
  2. Haz clic en el botón Agregar usuario.
  3. Sigue el asistente de creación de cuentas de usuario y completa los campos de autenticación por teléfono.

Sin embargo, en el caso de los flujos de autenticación por teléfono, el emulador NO activará la entrega de mensajes de texto, ya que la comunicación con un operador está fuera del alcance de la herramienta y no es adecuada para realizar pruebas locales. En cambio, el emulador imprime el código que se enviaría mediante SMS en la misma terminal en que ejecutaste firebase emulators:start. Ingresa este código en la app para simular que los usuarios revisan sus mensajes de texto.

Pruebas no interactivas

Para realizar pruebas no interactivas de autenticación por teléfono, usa la API de REST del emulador de Authentication para recuperar los códigos SMS disponibles. Ten en cuenta que el código es diferente cada vez que inicias el flujo.

La secuencia típica es la siguiente:

  1. Llama al método signInWithPhoneNumber de la plataforma para iniciar el proceso de verificación.
  2. Recupera el código de verificación mediante el extremo de REST específico del emulador.
  3. Llama a confirmationResult.confirm(code) como de costumbre con el código de verificación.

Autenticación de varios factores con SMS

El emulador de Authentication admite el prototipado y las pruebas de los flujos de autenticación de varios factores (MFA) de SMS disponibles en producción para iOS, Android y la Web.

Cuando agregas un usuario simulado al emulador, puedes habilitar la 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 a la misma terminal en la que ejecutaste firebase emulators:start y están disponibles en la interfaz de REST.

Autenticación emulada con proveedor de identidad (IdP) de terceros

El emulador de Authentication te permite probar numerosos flujos de autenticación de terceros en tus apps para iOS, Android o la Web sin modificar el código de producción. Para ver ejemplos de flujos de autenticación, consulta la documentación de diversas combinaciones de proveedores y plataformas que puedes usar en tu app.

En general, puedes usar el SDK de Firebase para autenticarte de dos maneras:

  • Tu app permite que el SDK controle todo el proceso de extremo a extremo, incluidas todas las interacciones con IdP de terceros para recuperar credenciales.
  • Tu app recupera de forma manual las credenciales de un proveedor de terceros mediante su SDK y pasa las credenciales al SDK de Authentication.

Una vez más, recomendamos que revises el vínculo de documentación que indicamos anteriormente y que te asegures de conocer el flujo de trabajo que quieres usar (el proceso administrado por el SDK de Firebase o la recuperación de credenciales manual). El emulador de Authentication admite pruebas de cualquiera de los enfoques.

Prueba flujos de IdP administrados por el SDK de Firebase

Si tu app usa cualquier flujo de extremo a extremo del SDK de Firebase, como OAuthProvider para el acceso con Microsoft, GitHub o Yahoo, en el caso de las pruebas interactivas, el emulador de Authentication entrega una versión local de la página de acceso correspondiente para ayudarte a probar la autenticación desde apps web que llaman a los métodos signinWithPopup o signInWithRedirect. Esta página de acceso local se muestra también en las apps para dispositivos móviles, y la biblioteca WebView de la plataforma se encarga de renderizarla.

El emulador crea cuentas de usuario y credenciales de terceros de prueba, según sea necesario, a medida que se ejecutan los flujos.

Prueba flujos de IdP con recuperación manual de credenciales

Si usas técnicas de acceso “manual” y llamas al método signInWithCredentials de tu plataforma, como de costumbre, tu app solicitará credenciales de acceso reales del tercero y recuperará tales credenciales.

Ten en cuenta que el emulador solo admite la autenticación de signInWithCredential para las credenciales obtenidas del Acceso con Google, con Apple y con otros proveedores que usan tokens de ID implementados como tokens web JSON (JWT). No se admiten los tokens de acceso (p. ej., aquellos proporcionados por Facebook o Twitter, que no son JWT). En la siguiente sección, se analiza una alternativa para esos casos.

Pruebas no interactivas

Un enfoque para realizar pruebas no interactivas es automatizar los clics del usuario en la página de acceso que entrega el emulador. En el caso de las apps web, usa una interfaz de control como WebDriver. En el caso de dispositivos móviles, usa las herramientas de pruebas de IU correspondientes a tu plataforma, como Espresso o Xcode.

De forma alternativa, puedes actualizar tu código para que utilice signInWithCredential (p. ej., en una rama de código) y usar un flujo de autenticación con tokens de ID ficticios para las cuentas en lugar de credenciales reales.

  1. Reformula o marca como comentario la parte de tu código que recupera idTokens del IdP. Con esta acción, no será necesario ingresar nombres de usuario y contraseñas reales durante tus pruebas, y estas no consumirán las cuotas ni los límites de frecuencia de las APIs del IdP.
  2. Luego, usa una cadena JSON literal en lugar del token para signInWithCredential. Si usas el SDK web como ejemplo, puedes reemplazar el código por este:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
  '{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));

Cuando se use con el emulador, este código autenticará correctamente a un usuario con el correo electrónico foo@example.com en Google. Considera que el subcampo es una clave primaria que se puede cambiar a cualquier cadena, lo que simula el acceso de diferentes usuarios. Por ejemplo, puedes reemplazar firebase.auth.GoogleAuthProvider por new firebase.auth.OAuthProvider('yahoo.com') o cualquier otro ID de proveedor que quieras simular.

Autenticación emulada con token personalizado

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

Diferencias entre el emulador de Authentication y el entorno de producción

El emulador de Firebase Authentication simula muchas funciones del producto de producción. Sin embargo, debido a que cualquier tipo de sistema de autenticación depende en gran medida de la seguridad en varios niveles (dispositivo, proveedores externos, Firebase, etc.), es difícil que el emulador recree todos los flujos de manera correcta.

Cloud IAM

Firebase Emulator Suite no intenta replicar ni respetar ningún comportamiento relacionado con la IAM para la ejecución. Los emuladores cumplen con las reglas de seguridad de Firebase proporcionadas, pero, en situaciones en las que normalmente se usaría la IAM (por ejemplo, para configurar Cloud Functions que invoquen la cuenta de servicio y los permisos), el emulador no se puede configurar y utiliza la cuenta con disponibilidad global en tu máquina de desarrollador, de manera similar a ejecutar una secuencia de comandos local directamente.

Ya que en las plataformas para dispositivos móviles el acceso mediante vínculos de correos electrónicos se basa en Firebase Dynamic Links, todos esos vínculos se abrirán en la plataforma web (móvil).

Acceso de terceros

En los flujos de acceso de terceros, Firebase Authentication se basa en credenciales seguras de proveedores externos como Twitter y GitHub.

El emulador de Authentication acepta credenciales reales de proveedores de OpenID Connect, como Google y Apple. No se admiten las credenciales de proveedores que no son de OpenID Connect.

Acceso por correo electrónico y SMS

En las apps de producción, los flujos de acceso por correo electrónico y SMS implican una operación asíncrona en la que el usuario verifica un mensaje recibido y, luego, ingresa un código de acceso en una interfaz de acceso. El emulador de Authentication no envía correos electrónicos ni mensajes SMS, pero, como se describió anteriormente, genera códigos de acceso y los envía a la terminal para que se usen en pruebas.

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

Autenticación con token personalizado

El emulador de Authentication no valida la firma ni el vencimiento de los tokens personalizados, lo que permite usar tokens creados manualmente y reutilizar tokens de forma indefinida en situaciones de prototipado y prueba.

Límite de frecuencia y protección contra el abuso

El emulador de Authentication no replica las funciones de límite de frecuencia de producción ni de protección contra el abuso.

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 Authentication escribe para almacenar dos veces, una después de la creación del usuario y otra después de acceder. Esto significa que, en el caso de los usuarios nuevos, puedes llamar correctamente a getAuth().getUser() en beforeSignIn en el emulador de Authentication, pero encontrarás un error en producción.

Próximos pasos