petid-wikimemoria rápida, no arquitectura
‹ todos los flujos

Login: refresh rotation + detección de reuso

petid-api
actualizado 2026-09-02

Objetivo

Rotación de refresh tokens con detección de robo/replay, sin necesidad de que el usuario haga nada.

Cómo empieza

POST /auth/login con email+password válidos y sin 2FA → IssueSessionUseCase crea una Session en Redis y firma access+refresh.

Pasos principales

  1. POST /auth/refresh llega con un refresh token. RefreshUseCase lo verifica (firma JWT) y busca la sesión por el hash del token (sessions.findByRefreshTokenHash) — el token en claro nunca se guarda.
  2. Si la sesión existe y está activa: se rota — nueva Session (nuevo id, nuevo hash), la vieja se reemplaza (sessions.rotate). El refresh token usado deja de ser válido para siempre.
  3. Si el token tiene firma válida pero no mapea a ninguna sesión activa → ya fue rotado antes. Eso es reuso: sessions.revokeAllForUser(sub) y TokenReusedError. Mata todas las sesiones del usuario, no solo esa.
  4. Sesión encontrada pero marcada revoked → mismo tratamiento (revoke-all + error), es la señal más fuerte de robo.
  5. Sesión encontrada pero solo expirada (no revocada) → caída normal, revoca solo esa sesión, error distinto (UnauthorizedError, no TokenReusedError).

Reglas de negocio

Interacciones

Ninguna externa — todo vive en Redis (RedisSessionRepository), sin tocar Postgres.

Dónde seguir mirando

Casos especiales