Spaces:
Sleeping
Sleeping
Commit History
-
Sesiones revocables: logout real y cierre en todos los dispositivos
Jose Salazar +1: Claude Opus 5ARCHITECTURE_REVIEW §2.3. Las sesiones son cookies firmadas sin estado y el logout se limitaba a borrar la cookie del navegador: el token seguía siendo VÁLIDO allá donde se hubiera copiado, hasta `session_max_age_s` (8h). No había forma de invalidar una sesión filtrada ni de echar a nadie tras un incidente, salvo rotar MORPHOS_SESSION_SECRET, que tira a todos los usuarios a la vez. Dos mecanismos, porque resuelven cosas distintas (migración 4): - `sesiones_revocadas`: una sesión concreta, por `jti`. Se recuerda sólo hasta que su firma caduca por sí sola; a partir de ahí la fila sobra y se poda. - `usuarios.sesiones_validas_desde`: TODAS las de una cuenta a la vez, con el nuevo POST /api/auth/logout-todas. Un sello temporal en vez de un contador de versión porque la pregunta es «¿se emitió antes del corte?». `jti` y `emitida_en` los añade `firmar_sesion`, no quien llama: si se generaran fuera, una ruta podría emitir por descuido una sesión irrevocable. TIMESTAMPS EN PYTHON, NO …2f5c422
-
No tragar errores de programación al leer la sesión
Jose Salazar +1: Claude Opus 5leer_sesion capturaba (BadSignature, Exception). El `Exception` hacía redundante el `BadSignature` y, sobre todo, convertía cualquier error interno en «no hay sesión»: un bug en la capa de sesión salía como un 401 silencioso en vez de propagarse, que es justo lo que no se quiere en el camino de autenticación. Se captura BadData, el padre común de: - BadSignature firma inválida o falsificada - SignatureExpired sesión caducada (subclase de BadSignature) - BadPayload token corrupto Las tres son «cookie no válida» → sin sesión. Un TypeError o un fallo de configuración ahora se propagan. Nota: (BadSignature, SignatureExpired) —la corrección que se propuso primero— habría repetido el mismo error en pequeño, porque SignatureExpired ya es subclase de BadSignature. Se añaden tests de sesión (no había ninguno), incluido el caso negativo que motiva el cambio: un error interno debe propagarse, no devolver None. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>5af9605