API · Seguridad
Autentica, rota y cambia de workspace sin ampliar autoridad.
Las sesiones administrativas combinan un JWT corto con una sesión server-side revocable. El refresh token vive en una cookie HttpOnly y cada cambio de workspace invalida las credenciales anteriores.
Superficie de sesión
- POST
/auth/sessionsInicia una sesión con email y contraseña.
- POST
/auth/sessions/refreshRota access token y refresh token.
- GET
/meDevuelve identidad y membresías visibles.
- PATCH
/auth/sessions/currentCambia la membresía activa y rota toda la sesión.
- DELETE
/auth/sessions/currentRevoca la sesión actual.
15 minutos
Vida del access token administrativo.
HttpOnly
El JavaScript del navegador no lee el refresh token.
Fail closed
Sesión o membresía revocada invalida el JWT aunque no haya expirado.
No store
La API impide almacenar respuestas operativas en caches.
Volver a la landing no es logout
La navegación pública espera la verificación de la cookie y muestra el dashboard autorizado cuando la sesión sigue vigente. Las pestañas compatibles serializan el refresh; una petición obsoleta que recibe 401 no envía una cookie de borrado capaz de sobrescribir otra rotación más reciente.
Cambiar la membresía activa
Envía únicamente un active_membership_id obtenido de GET /me. La operación requiere el bearer y el refresh vigentes; una membresía ajena responde como no visible y no consume la sesión actual.
curl --request PATCH http://localhost:8080/api/v1/auth/sessions/current \
--header "Authorization: Bearer <access_token>" \
--header "Content-Type: application/json" \
--cookie "convray_refresh=<refresh_token>" \
--data '{"active_membership_id":"00000000-0000-4000-8000-000000000002"}'Errores esperables
401 invalid_session- Bearer, refresh o sesión server-side no están vigentes. Inicia sesión otra vez.
403 csrf_rejected- El Origin del navegador no está permitido. Revisa el origen configurado.
404 resource_not_found- La membresía no existe o no es visible para el usuario autenticado.
429 rate_limited- Espera los segundos indicados por Retry-After antes de reintentar.