Robustez en la Autenticación: Integración con Emuladores y Custom Claims en TuTiendaWeb
¿Cuántas veces has escuchado que la autenticación es una de las partes más críticas y complejas de una aplicación? Y, ¿cuántas veces has sentido el dolor de intentar probarla a fondo, asegurando que cada flujo, cada claim y cada sesión de servidor funcione a la perfección, sin tocar la producción? En TuTiendaWeb, abordar este desafío se convirtió en un pilar fundamental de nuestra Fase 2 de desarrollo.
En el proyecto TuTiendaWeb, estamos construyendo una plataforma robusta para tiendas online. La "Fase 2: Integración con Emuladores" se centró en establecer un entorno de prueba aislado y confiable para nuestros servicios, especialmente para todo lo relacionado con la autenticación y la gestión de usuarios.
La autenticación no es solo un login y un password. Implica la gestión de sesiones del lado del servidor, la asignación de roles o permisos personalizados (custom claims), la persistencia de usuarios en bases de datos y la garantía de que estos procesos sean idempotentes y seguros. Probar todas estas interacciones de forma integrada, pero sin incurrir en costos de Firebase en la nube ni afectar datos reales, es un reto significativo. Necesitábamos una manera de simular la pila completa de Auth y Firestore de forma local y controlada.
Para superar estos desafíos, implementamos una estrategia de pruebas de integración exhaustiva utilizando los emuladores de Firebase. Esto nos permitió simular el entorno de producción de Firebase Auth y Firestore localmente, lo que facilitó la creación de pruebas consistentes y aisladas.
Claves de Nuestra Implementación
- Emuladores de Firebase Auth y Firestore: Establecimos entornos de prueba donde Auth y Firestore se ejecutaban localmente, garantizando que cada prueba comenzara desde un estado limpio.
- Claims Personalizados (
custom claims): Creamos un flujo completo parasetUserClaims,getUserClaims,updateUserClaimsyrevokeUserTokens. Esto es crucial para la lógica de autorización de nuestra aplicación, permitiéndonos asignar roles comoadministradoropropietarioDeTiendadirectamente en el token del usuario. - Tokens ID Reales vía REST: Para simular escenarios realistas de sesión de servidor, mintamos tokens ID reales directamente desde el emulador de Auth utilizando su API REST. Esto nos permitió validar
getServerSessioncon tokens que contenían nuestros custom claims, tal como lo haría un entorno de producción. - Servicios de Usuario Resilientes: Desarrollamos un
user.servicerobusto con funciones comocreateUserInFirestore,getUserFromFirestoreygetOrCreateUserFromGoogle. Estas funciones fueron diseñadas para ser idempotentes, asegurando que la creación o recuperación de un usuario no generara conflictos ni duplicados, incluso bajo múltiples invocaciones. - Validación de Acciones Críticas: También integramos pruebas para acciones de usuario fundamentales, como
registerAction(con casos de email duplicado y contraseñas débiles) ycheckSlugAvailabilityActionpara la creación de tiendas.
El uso de Vitest para nuestras suites de prueba nos permitió ejecutar 93 tests en 6 suites, con un énfasis en el aislamiento y la idempotencia. Esto se verificó ejecutando las suites múltiples veces seguidas contra el mismo emulador, garantizando la consistencia y fiabilidad.
Ejemplo de Código: Estableciendo un Custom Claim
Aquí un ejemplo simplificado de cómo se podría establecer un custom claim para un usuario después de su autenticación, fundamental para nuestra lógica de roles:
import { getAuth } from 'firebase-admin/auth'; // Usar SDK de Admin en backend
async function setStoreOwnerClaim(uid: string, storeId: string): Promise<void> {
try {
await getAuth().setCustomUserClaims(uid, { storeId: storeId, role: 'owner' });
console.log(`Claims personalizados para el usuario ${uid} actualizados con storeId: ${storeId}`);
} catch (error) {
console.error('Error al establecer claims personalizados:', error);
throw error;
}
}
// Ejemplo de uso
// const userId = 'some-user-uid';
// const userStoreId = 'new-store-123';
// setStoreOwnerClaim(userId, userStoreId);
Este fragmento de TypeScript demuestra cómo, en un entorno de backend (o en funciones de Firebase), podemos enriquecer el token de autenticación de un usuario con información adicional. Estos custom claims son luego incluidos en el ID token del usuario y pueden ser verificados en el frontend o en otras funciones de backend para controlar el acceso y la lógica de la aplicación.
La inversión en pruebas de integración completas, utilizando emuladores de Firebase y un enfoque meticuloso en la gestión de custom claims y sesiones de servidor, ha fortalecido significativamente la base de autenticación de TuTiendaWeb. Este enfoque no solo nos ahorra tiempo y dinero al evitar despliegues innecesarios durante el desarrollo, sino que también nos brinda la confianza de que nuestros flujos de autenticación son robustos, seguros e idempotentes. Un paso crucial hacia una plataforma confiable y escalable.
Generated with Gitvlg.com