Firebase Auth en Angular: cómo una doble versión rompía Google Login
Estaba validando el flujo de inicio de sesión con Google en Angular + AngularFire. A nivel de código, todo parecía correcto, pero en runtime seguían apareciendo errores como estos:
Component auth has not been registered yetFirebase: No Firebase App '[DEFAULT]' has been created - call initializeApp() first
La causa real no estaba en una sola línea de configuración, sino en una combinación de conflicto de dependencias + contexto de ejecución.
Contexto
Objetivo del flujo:
- Inicializar Firebase App.
- Inicializar Firebase Auth.
- Ejecutar Google Login con popup.
- Enviar el token al backend para autenticar contra la API.
La inyección de dependencias en Angular se veía bien, pero el registro interno de componentes de Firebase quedaba inconsistente en runtime.
Punto clave de arquitectura: Browser vs SSR
Este punto fue importante para estabilizar la implementación: usar configuración separada para browser y server.
src/main.tsusaapp.config.browser.ts.src/main.server.tsusaapp.config.server.ts.- Firebase se inicializa solo en browser (
app.config.browser.ts), no en SSR.
Eso evita errores por APIs exclusivas del navegador (popup OAuth, indexedDB, estado de sesión local) cuando el render corre en servidor.
El problema real: doble versión interna de Firebase
Después de revisar stack traces y el árbol de dependencias, encontré mezcla de versiones internas de @firebase/app.
Aunque firebase estaba en 10.x, el árbol tenía resolución dual de @firebase/app en distintos niveles. Eso provoca que una parte del SDK registre componentes en un contenedor interno, y otra parte (como Auth) los intente resolver desde otro.
Resultado: errores de inicialización e inyección que parecen aleatorios.
Señales que llevaron al diagnóstico
- Error de registro de
authaun con providers declarados. - Error alternando entre
auth not registeredyapp/no-app. - Comportamiento inconsistente según cómo se abría el navegador.
- Confirmación con
npm ls @firebase/appmostrando resolución conflictiva.
Corrección aplicada
La corrección fue forzar una única versión compatible de @firebase/app para todo el proyecto y reinstalar dependencias.
{
"dependencies": {
"@firebase/app": "0.10.13"
}
}
Luego:
npm install
npm ls @firebase/app
Además, dejé la inicialización de Auth ligada explícitamente a la app inyectada para evitar dependencia implícita del orden:
provideAuth((injector) => getAuth(injector.get(FirebaseApp)));
Resultado
Después de deduplicar dependencias y mantener la inicialización explícita:
- Firebase App y Auth iniciaron correctamente.
- El login con Google funcionó.
- El backend pudo recibir y validar el token sin errores de inicialización.
Observación sobre Run and Debug
Detecté una diferencia importante:
- Desde Run and Debug (Chrome lanzado por VS Code), el flujo no siempre funcionaba igual.
- Desde navegador abierto manualmente en
http://localhost:4200, el login sí funcionaba.
Esto sugiere diferencias de perfil/sesión del navegador (cookies, popups, extensiones, políticas locales) que impactan el flujo OAuth.
Para pruebas de Firebase Auth, me funcionó mejor este enfoque:
- Validar el flujo OAuth en navegador normal como prueba de referencia.
- Usar debugger para revisar lógica de app, no como único validador del login externo.
Aprendizajes
- Un error de DI en Firebase puede ser realmente un problema de versiones transitorias.
- En incidentes de Auth,
npm lses parte obligatoria del diagnóstico. - Separar
app.config.browseryapp.config.serverevita problemas en SSR. - El contexto de ejecución (debugger vs navegador normal) puede alterar flujos OAuth.