RF05: Usuario cierra sesión
Descripción
Como usuario autenticado, quiero cerrar mi sesión para dejar de tener acceso desde este dispositivo y proteger mis datos.
El logout revoca la sesión actual en la base de datos (revoked_at = now(), revoked_by = 'user') y borra los tokens del dispositivo, conforme al Control de Sesiones §3.3.
| Campo | Valor |
|---|---|
| Módulo | Auth Module |
| Actor | Usuario autenticado |
| Endpoint | POST /auth/logout |
| Precondiciones | Sesión activa con access token válido |
| Prioridad | Alta (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF02, RF06 |
Reglas de negocio
- RN-05.1 — Se revoca únicamente la sesión del
session_idcontenido en el JWT; otras sesiones del usuario permanecen activas. - RN-05.2 — La app borra el
access_tokende memoria y elrefresh_tokendeSecureStore. - RN-05.3 — En cuentas con login social, opcionalmente se llama
GoogleSignin.signOut()para limpiar el estado local del proveedor. - RN-05.4 — El logout es idempotente: cerrar una sesión ya revocada devuelve igualmente éxito.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
Authorization | Header Bearer <access_token> válido. | "Sesión no válida." (401) |
Criterios de aceptación
Escenario 1: Logout exitoso
Dado que tengo una sesión activa,
Cuando confirmo "Cerrar sesión",
Entonces el backend marca la sesión como revocada (revoked_by = 'user'),
Y responde 200 OK,
Y la app borra el access token de memoria y el refresh token de SecureStore,
Y soy redirigido a la pantalla de inicio de sesión.
Escenario 2: El refresh token revocado no renueva
Dado que cerré sesión,
Cuando alguien intenta renovar con el refresh token ya revocado,
Entonces el backend responde 401 y no emite un nuevo access token.
Escenario 3: Otras sesiones no se ven afectadas
Dado que tengo sesión en dos dispositivos, Cuando cierro sesión en uno, Entonces la sesión del otro dispositivo sigue activa.
Escenario 4: Token ausente o inválido
Dado que la solicitud no incluye un access token válido,
Cuando llega al endpoint,
Entonces el sistema responde 401 Unauthorized.
Criterios no funcionales
- Respuesta < 500 ms.
- Comunicación sobre TLS 1.2+.
- El access token sigue siendo técnicamente válido hasta máx. 15 min, pero el refresh queda revocado.