Saltar al contenido principal

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.

CampoValor
MóduloAuth Module
ActorUsuario autenticado
EndpointPOST /auth/logout
PrecondicionesSesión activa con access token válido
PrioridadAlta (MVP)
EtapaMVP
Requisitos relacionadosRF02, RF06

Reglas de negocio

  • RN-05.1 — Se revoca únicamente la sesión del session_id contenido en el JWT; otras sesiones del usuario permanecen activas.
  • RN-05.2 — La app borra el access_token de memoria y el refresh_token de SecureStore.
  • 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

CampoReglasMensaje de error
AuthorizationHeader 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.

Diagrama de secuencia