-
Trata el cliente móvil como no confiable: Asume que los atacantes pueden extraer valores agrupados, enganchar APIs nativas y reproducir tokens de dispositivos comprometidos - diseña sesiones que limiten el radio de explosión con acceso TTL corto y rotación de actualizaciones.
-
Nunca almacenes tokens de actualización en AsyncStorage: SQLite sin encriptar es trivialmente legible en dispositivos rooted - usa expo-secure-store con WHEN_UNLOCKED_THIS_DEVICE_ONLY (OWASP M2: Almacenamiento de datos inseguro).
-
Mantén tokens de acceso con corta duración: 5-15 minutos de TTL de token de acceso limita daño por intercepción - actualiza de forma proactiva antes de caducidad, no solo después de 401 (OWASP M4: Autenticación insegura).
-
Rota tokens de actualización en cada intercambio: Emite un nuevo token de actualización e invalida el anterior - detecta reutilización como señal de violación y revoca toda la familia de tokens (OWASP M4).
-
Implementa logout en todas partes: El cierre de sesión local es insuficiente para dispositivos robados - expone revocación de actualización del lado del servidor que invalida todas las sesiones para el usuario (OWASP M4).
-
Borra SecureStore, caché de Query y navegación en logout: deleteItemAsync para todas las claves de autenticación, queryClient.clear() y router.replace para iniciar sesión - el botón atrás de Android no debe revelar pantallas autenticadas (OWASP M2).
-
Usa Authorization Code + PKCE para OAuth: El móvil es un cliente público - nunca flujo implícito (response_type=token) o WebViews incrustadas; usa expo-auth-session con usePKCE: true (OWASP M4).
-
Intercambia códigos OAuth en tu backend cuando existan secretos: Los secretos de cliente no pertenecen en el paquete de app - envía code + code_verifier a tu servidor para intercambio de tokens (OWASP M1: Uso incorrecto de la plataforma).
-
Registra URIs de redirección por variante de compilación: La salida de makeRedirectUri() debe coincidir con consolas de Google, Apple e IdP para dev, preview y producción - redirect_uri_mismatch es el principal error de integración OAuth.
-
Nunca pongas secretos de cliente OAuth en EXPO_PUBLIC_*: Las variables de entorno públicas se incluyen en el paquete Hermes - audita con npx expo config --type public antes de cada lanzamiento (OWASP M2).
-
Adjunta tokens mediante Authorization: Bearer - no parámetros de consulta URL: Las cadenas de consulta aterrizan en registros, análisis y encabezados de referencia - solo encabezados para tokens de acceso (OWASP M3: Comunicación insegura).
-
Usa HTTPS para todos los endpoints de autenticación y API: Sin excepciones de texto plano en producción - TLS del sistema en SDK 57 es el predeterminado; el pinning de certificados requiere un ADR (OWASP M3).
-
Reintento único de 401 con actualización deduplicada: Una promesa de actualización en vuelo para 401s paralelos - bucles de reintento infinito enmascarán configuración incorrecta y abrumarán el servidor de autenticación (OWASP M4).
-
Distingue offline de sesiones revocadas: Las fallas de red durante la actualización no deben forzar cierre de sesión - session_expired_offline vs session_expired evita logout de modo avión en rabia (OWASP M7: Calidad del código del cliente).
-
Actualización proactiva en reanudación de primer plano: El listener AppState actualiza cuando shouldRefresh(session) después de trasfondo - los usuarios no deberían ver indicaciones de re-login cada hora (OWASP M4).
-
Aplica búfer de sesgo de reloj a caducidad del cliente: Actualiza 30-120 segundos antes de expiresAt del cliente - prefiere serverTime en respuestas de actualización sobre solo el reloj del dispositivo (OWASP M5: Criptografía insuficiente).
-
La biometría prueba presencia - no identidad para el servidor: Usa expo-local-authentication para UX de step-up; los endpoints de alto riesgo aún necesitan MFA del servidor o tokens de step-up (OWASP M4).
-
Ofrece alternativa de código de acceso para flujos biométricos: disableDeviceFallback: false - atrapar usuarios sin biometría enrolada falla en accesibilidad y expectativas de App Review (OWASP M1).
-
Espacios de nombres de claves de SecureStore por cuenta: Las apps multi-cuenta usan auth.refresh_token.{accountId} - cambiar cuenta purga TanStack Query y Zustand antes del bootstrap (OWASP M2 / M6).
-
Vincula tokens de actualización a ID de dispositivo del lado del servidor: Envía deviceId estable en login y actualización - el servidor rechaza dispositivos desconocidos; los usuarios pueden revocar dispositivos perdidos desde configuración (OWASP M4).
-
Incluye userId en claves de caché de TanStack Query: Previene flash de datos entre cuentas durante cambio incluso si la purga compite - queryKey: ['orders', userId] (OWASP M6: Autorización insegura).
-
Nunca confíes en afirmaciones JWT del lado del cliente para autorización: Decodifica afirmaciones solo para mostrar - el servidor valida roles y alcances en cada solicitud (OWASP M6).
-
Borra tokens de registros e informes de fallos: Redacta encabezados Authorization en breadcrumbs de Sentry y registros estructurados - tokens en volcados de fallos son un hallazgo común de auditoría (OWASP M2).
-
Degrada gracefully en señales de jailbreak/root: Las acciones de alto riesgo (pagos, exportación de PII) justifican bloqueos o MFA - no bloquees completamente apps en señales suplantables sin aprobación de producto/legal (OWASP M8: Code Tampering).
-
Prueba auth en compilaciones de desarrollo - no solo Expo Go: Los URIs de redirección OAuth, grupos de acceso de Keychain y derechos de Apple Sign In difieren de Expo Go - las pruebas E2E de auth se ejecutan contra bundle IDs reales antes de envío de store (OWASP M9: Ingeniería inversa).
Versiones de stack: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (expo ~57.0.4).