Cuando utilizamos Firebase con React.js utilizamos el método onAuthStateChanged() de Firebase en el método componentDidMount de React, así aceleramos el render inicial de la aplicación y evitamos problemas de Server Side Rendering 😉.
Recursos
Resumen
Controla el estado de autenticación con confianza: aprende a leer el usuario actual, ejecutar sign out, reaccionar a cambios con el observador de Firebase y actualizar el UI con botón, avatar e inputs. Todo con código claro y seguro, sin exponer contraseñas.
¿Cómo gestionar el estado de autenticación con Firebase Auth?
Para saber si hay alguien autenticado, se usa firebase.auth().currentUser. Firebase guarda las credenciales en caché del navegador y permite leer datos del perfil, no la contraseña. Así, puedes decidir si abrir el modal de acceso o ejecutar sign out.
// Evento del botón "Iniciar sesión" loginBtn.addEventListener('click', () => { const user = firebase.auth().currentUser; // usuario actual if (user) { // Usuario autenticado: cambiar flujo a *sign out*. loginBtn.textContent = 'Iniciar sesión'; firebase.auth().signOut() // es una promesa .then(() => { // Colocar avatar por defecto. // console.log('Sign out correcto'); }) .catch((error) => { // console.error('Error al realizar el sign out', error); }); // Limpiar inputs de email y password. // Abrir modal si corresponde. } else { // No hay usuario: abrir modal de autenticación. // Limpiar inputs de email y password. } });
Puntos clave:
- currentUser decide el flujo: autenticado o no autenticado.
- signOut() devuelve una promesa: usa then para éxito y catch para errores.
- UI consistente: botón cambia de texto y el avatar vuelve a la imagen por defecto.
¿Qué errores comunes aparecen y cómo resolverlos?
- Olvidar paréntesis en signOut(): la función no se ejecuta.
- Imprimir una variable error sin haberla definido: usa catch(error) y regístrala.
- No limpiar inputs tras sign out: deja el estado visual inconsistente.
¿Qué hace onAuthStateChanged y por qué es clave?
Firebase ofrece un observador permanente: firebase.auth().onAuthStateChanged. Cada vez que cambia el estado del usuario (inicia sesión o hace sign out), esta función se ejecuta. Así, el UI se mantiene sincronizado incluso al refrescar la página.
firebase.auth().onAuthStateChanged((user) => { if (user) { // Usuario autenticado. loginBtn.textContent = 'Salir'; // Si el proveedor entregó una foto, úsala. if (user.photoURL) { // avatar.src = user.photoURL; } else { // avatar por defecto (email/password no trae *photoURL*). } } else { // Usuario no autenticado. loginBtn.textContent = 'Iniciar sesión'; // avatar por defecto. } });
Beneficios prácticos:
- UI reactivo: el botón pasa a “Salir” al autenticarse y vuelve a “Iniciar sesión” al cerrar sesión.
- Avatar correcto: si el usuario viene de Google o Facebook, existe photoURL; con email y password, se usa imagen por defecto.
- Persistencia: al refrescar, Firebase valida el estado desde la caché del browser y ajusta el UI.
¿Cómo se refleja en la experiencia del usuario?
- Mensaje de bienvenida al autenticarse.
- Sign out confirma éxito y restablece el avatar por defecto.
- Al no estar autenticado, el botón abre el modal de acceso.
¿Qué habilidades y keywords refuerzas en este módulo?
Al implementar este flujo consolidas prácticas de frontend y autenticación con Firebase:
- Uso de Firebase Auth con currentUser para leer el estado.
- Manejo de promesas con then y catch en signOut().
- Patrón observador con onAuthStateChanged para UI reactivo.
- Gestión de avatar con photoURL y imagen por defecto cuando no hay foto.
- Control de UI states: cambio de texto del botón “Iniciar sesión/Salir”.
- Limpieza de inputs de email y password tras sign out.
- Buenas prácticas de consola: detección de errores y mensajes claros.
- Comprensión de caché del navegador para persistir la sesión.
¿Te gustaría ver variantes del flujo para más proveedores o mejorar los mensajes de estado? Comparte tus dudas y cuéntanos qué casos quieres cubrir.
