Estoy creando una API RESTful que usa tokens JWT para la autenticación del usuario (emitida por un punto final login
y enviada en todos los encabezados posteriormente), y los tokens deben actualizarse después de un período de tiempo fijo (invocar un renew
endpoint, que devuelve un token renovado).
Es posible que la sesión de la API de un usuario se convierta en inválida antes de que caduque el token, por lo tanto, todos mis puntos finales se inician al verificar que: 1) el token sigue siendo válido y 2) la sesión del usuario todavía es válida. No hay forma de invalidar directamente el token, porque los clientes lo almacenan localmente.
Por lo tanto, todos mis puntos finales deben indicar a mis clientes dos posibles condiciones: 1) que es hora de renovar el token o 2) que la sesión se ha vuelto inválida y ya no se les permite acceder al sistema. Puedo pensar en dos alternativas para que mis puntos finales señalen a sus clientes cuando se produce una de las dos condiciones (suponiendo que los clientes pueden adaptarse a cualquiera de las opciones):
- Devuelva un código http 401 (no autorizado) si la sesión no es válida o devuelva un código 412 (condición previa fallida) cuando el token haya caducado y sea el momento de llamar al punto final
renew
, que devolverá un 200 (ok) código. - Devuelve 401 para indicar que la sesión no es válida o que el token ha caducado. En este caso, el cliente llamará inmediatamente al punto final
renew
, si devuelve 200, entonces el token se actualizará, pero sirenew
también devuelve 401, eso significa que el cliente está fuera del sistema.
¿Cuál de las dos alternativas anteriores recomendarías? ¿Cuál sería más estándar, más fácil de entender y / o más RESTful? ¿O recomendarías un enfoque completamente diferente? ¿Ve algún problema obvio o riesgos de seguridad con alguna de las opciones? Puntos adicionales si su respuesta incluye referencias externas que apoyan su opinión.
ACTUALIZAR
Chicos, céntrese en la pregunta real: ¿cuál de las dos alternativas de código http para señalar una renovación / invalidación de sesión es la mejor? No me importa el hecho de que mi sistema use JWT y sesiones del lado del servidor, esa es una peculiaridad de mi API para reglas comerciales muy específicas, y no la parte para la que busco ayuda;)