Módulo 4 · Autenticación y seguridad

Lección 18 — Sesiones frente a tokens

JWT y sus riesgos, refresh tokens y qué encaja mejor con cada cliente.

Publicada
En esta lección
  1. Ejercicio 1 — Login con tokens
  2. Ejercicio 2 — Mira dentro del JWT
  3. Ejercicio 3 — Dónde vive el token
  4. Ejercicio 4 — El ADR-0008
  5. Ejercicio 5 — Logout que funciona de verdad
  6. Entrega

pip install djangorestframework-simplejwt. No mires solutions.md hasta entregar.

Ejercicio 1 — Login con tokens

  1. Configura SimpleJWT (access 10 min, refresh 7 días, rotación + blacklist) y los endpoints de token. Haz login con tu usuario de prueba y anota los dos tokens.
  2. Llama a GET /api/reservations/ con Authorization: Bearer <access>: 200. Sin header: 401. Con token expirado (espera o ajusta el lifetime a 5s): 401 con token_not_valid.
  3. Refresh: obtén un nuevo access y verifica que el refresh viejo ya no sirve (blacklist tras rotación).

Ejercicio 2 — Mira dentro del JWT

  1. Copia tu access token en jwt.io (o base64 -d por partes): ¿qué claims ves? ¿Está tu email? ¿Podría ir tu número de tarjeta?
  2. Cambia un carácter del payload y usa el token: ¿qué error exacto? (firma inválida).
  3. Pregunta: ¿qué pasaría si el payload llevara el rol y alguien lo editara? (sin la firma no puede — explica el mecanismo).

Ejercicio 3 — Dónde vive el token

  1. Sirve una mini-página de prueba que haga fetch a tu API con el access en localStorage vs en cookie HttpOnly; SameSite=Lax. Inyecta un "XSS" simulado (script que lee storage/document.cookie): ¿qué puede robar en cada caso?
  2. Configura CSRF_TRUSTED_ORIGINS y prueba el flujo con cookie + SameSite=Lax desde un "origen malo" (curl con Origin falso): ¿pasa el CSRF de Django?
  3. Escribe el resumen de 3 líneas para tu README: dónde vive qué token en TicketFlow y por qué.

Ejercicio 4 — El ADR-0008

Escribe el ADR "Autenticación: JWT corto + refresh rotado en cookie HttpOnly" — contexto (web + móvil, revocación de compras), decisión, alternativas descartadas (solo sesión, JWT largo en localStorage), consecuencias (blacklist en Redis/BD, logout = blacklist del refresh, móviles con keychain).

Ejercicio 5 — Logout que funciona de verdad

  1. Implementa POST /api/auth/logout/ autenticado: blacklist del refresh del usuario. Verifica: tras logout, el refresh ya no da access.
  2. ¿Y el access ya emitido (válido hasta 10 min)? ¿Es aceptable? ¿Cómo lo cortarías si no (pista: blacklist por jti con check en cada request — y qué pagas)?

Entrega

Pega configuración, tokens (recortados: ¡no el real!) y conclusiones. Después: Lección 19 — OAuth2 y OIDC.