Los detalles siguientes provienen de la documentación de Firebase del 23 de octubre de 2026. Consúltala para ver los límites actuales. Para lo básico, qué envía Firebase y cómo probarlo, empieza por Prueba los correos de Firebase Authentication.
El correo nunca llega
Nada lo solicitó. createUserWithEmailAndPassword crea la cuenta y no envía ningún correo. Tu código de registro tiene que llamar a sendEmailVerification para el nuevo usuario. Si no lo hace, la cuenta queda sin verificar y quien prueba espera en vano.
La dirección no tiene cuenta. Con la protección contra enumeración de correos, activada por defecto en proyectos creados a partir del 15 de septiembre de 2023, sendPasswordResetEmail solo envía cuando la dirección pertenece a una cuenta, y no devuelve ningún error cuando no es así. Una prueba de restablecimiento con una dirección que nunca se registró pasa en tu app y no recibe nada. Regístrate primero y luego restablece.
Se agotó un límite diario. En el plan gratuito Spark, Firebase envía 5 inicios de sesión con enlace por correo al día, 150 restablecimientos de contraseña y 1.000 correos de verificación. El inicio de sesión sin contraseña deja de funcionar tras la quinta prueba del día. Añade facturación (Blaze) para staging, o prueba el inicio de sesión con enlace por correo con moderación.
Está en spam. Por defecto, los correos llegan desde noreply@, la dirección firebaseapp.com de tu proyecto, en la que algunas bandejas de entrada no confían. Configura tu propio dominio en las plantillas de correo de la consola. Una dirección de Proxy Mail QA los recibe de todos modos, así que puedes distinguir “no enviado” de “enviado a spam”.
Estás usando el emulador. El emulador de Auth no envía correos: muestra cada enlace de verificación, restablecimiento e inicio de sesión en la terminal donde se ejecuta y en la pestaña Logs de Emulator Suite, y los ofrece en un endpoint REST para las pruebas. Prueba con un proyecto de staging real antes del lanzamiento.
El registro falla
auth/email-already-in-use: la dirección ya tiene una cuenta. La protección contra enumeración no oculta este caso. Usa una dirección nueva en cada ejecución.- Demasiados registros: Firebase permite 100 cuentas nuevas por hora desde una misma dirección IP. Un conjunto de pruebas que se ejecuta desde una sola máquina de CI puede superarlo. Puedes programar un aumento temporal en la consola de Firebase.
- Reglas de contraseña: con una política de contraseñas activada, una contraseña débil falla con
auth/password-does-not-meet-requirements. Asegúrate de que tu formulario indique el motivo. - Protección contra bots: la protección de reCAPTCHA o la aplicación de App Check en Authentication pueden rechazar navegadores automatizados. Para App Check, dale a tus ejecuciones de prueba un token de depuración.
El inicio de sesión falla con auth/invalid-credential
Con la protección contra enumeración, una contraseña incorrecta y una dirección desconocida dan el mismo error (INVALID_LOGIN_CREDENTIALS, que el SDK web informa como auth/invalid-credential). Las pruebas que esperan auth/user-not-found o auth/wrong-password empiezan a fallar, y también las apps que muestran un mensaje distinto para cada caso. Comprueba ese único error en su lugar.
Se hizo clic en el enlace, pero la app sigue diciendo “verifica tu correo”
El objeto User que tiene tu app conserva el valor de emailVerified que tenía cuando la persona inició sesión. Después de que haga clic en el enlace en otra pestaña, llama a user.reload(), y a user.getIdToken(true) si tus reglas de seguridad o tu backend leen el claim email_verified. Hasta entonces, la app y tus reglas siguen viendo un usuario sin verificar.
El enlace falla
auth/invalid-action-codeoauth/expired-action-code: el enlace ya se usó o caducó. Solicita un correo nuevo y usa el más reciente.auth/unauthorized-continue-uri: la URL de continuación que pasa tu código no está en un dominio autorizado. Añade cada entorno en Authentication, Settings, Authorized domains. Los despliegues de vista previa reciben dominios nuevos, así que hay que añadir cada uno, o usar un dominio de staging fijo.- Lleva a localhost: la URL de continuación viene de tu código. Constrúyela a partir de una configuración del entorno en lugar de un
http://localhostfijo en el código. Más información en por qué los correos enlazan a localhost.
El inicio de sesión con enlace por correo vuelve a pedir el correo
El inicio de sesión con enlace por correo termina en el navegador que solicitó el enlace: tu app guarda la dirección allí (normalmente en localStorage) y la vuelve a leer cuando se abre el enlace. Si abres el enlace en otro dispositivo o navegador, la propia guía de Firebase indica volver a pedir la dirección, para evitar la fijación de sesión. Es lo esperado. Quienes prueban deben abrir el enlace donde empezaron. En una app móvil, el enlace también tiene que abrir la app, lo que funciona de otra forma desde que Dynamic Links dejó de funcionar: consulta Inicio de sesión con enlace por correo de Firebase para apps móviles.
Compruébalos todos de una vez
- Crea una dirección de Proxy Mail QA nueva para cada escenario: usuario nuevo, restablecimiento de contraseña (en una dirección que ya registraste), inicio de sesión con enlace por correo.
- Recorre el flujo en tu app. El enlace aparece en la fila de la dirección en segundos, o nunca, lo que te indica que no se envió nada.
- Mira la fila: un enlace a localhost aparece marcado, y la bandeja de entrada muestra el remitente y las comprobaciones de cada correo.
checkEmailconexpectHosthace fallar una prueba cuyo enlace lleve a cualquier sitio que no sea el tuyo. - Abre el enlace en el mismo navegador y luego comprueba que tu app muestre al usuario como verificado sin cerrar sesión y volver a iniciarla.
¿Lo creaste con Antigravity u otra herramienta de IA? Problemas en el registro e inicio de sesión de apps hechas con vibe coding explica lo que las apps generadas suelen hacer mal además de esto.