La app implementa un sistema de autenticacion custom basado en JWT, sin depender de servicios externos como Clerk, Auth0 o Supabase. Toda la logica se concentra en el modulo src/modules/auth/ y el cliente API en src/shared/services/api/.
El usuario ingresa email y contrasena 2. Se llama a authApi.login(email, password) 3. La
API devuelve: token, refreshToken, tokenExpiresIn, datos de usuario 4. Se calcula
tokenExpiry = Date.now() + tokenExpiresIn * 1000 5. Se almacenan tokens en SecureStore y
datos de usuario en SecureStore 6. Se limpia el cache de tokens del API client
(clearTokenCache) 7. Se actualiza el authStore con isAuthenticated: true 8. Se identifica
al usuario en PostHog analytics 9. Se inicializa la conexion a Stream Chat (no bloqueante) 10.
Se invalidan todas las queries de React Query
Si el usuario esta en modo visitor, se hace logout del modo guest primero 2. Se llama a
authApi.register(email, password) 3. El flujo continua identico al login (pasos 3-10)
Se limpia cualquier dato de auth previo en SecureStore 2. Se crea un usuario local con id: 'guest' 3. Se establece isAuthenticated: false, isVisitor: true 4. Se activa
setGuestMode(true) en el API client (omite tokens en requests) 5. Las funcionalidades estan
limitadas (tabs bloqueados, sin chat, etc.)
Cuando el access token expira, el sistema gestiona la renovacion automaticamente:
Request fallido (UNAUTHENTICATED) │ ▼┌─ Es el primer reintento? ─┐│ ││ SI NO ──┼──► Encolar request en requestQueue│ │ (espera a que termine el refresh)▼ │isRefreshing = true │ │ │ ▼ │refreshToken() │ │ │ ┌────┴────┐ │ │ │ │Exito Fallo │ │ │ │ ▼ ▼ │Reintentar Limpiar auth │request + + logout │procesar forzado │cola │
Las requests que llegan durante el proceso de refresh se encolan en requestQueue. Una vez
completado el refresh exitosamente, todas las requests encoladas se reintentan con el nuevo token.
Se accede a traves del wrapper secureStorage en src/shared/services/storage/secureStorage.ts.
Datos no sensibles:
Flags de estado de autenticacion
Estado de onboarding
Altura del teclado
Datos de cache del chat (token de Stream, userId)
Nunca almacenar tokens reales, URLs de API, ni credenciales en el codigo fuente ni en archivos de
configuracion que se commiteen al repositorio. Los valores sensibles se gestionan mediante
variables de entorno.