Mi idea es usar tokens encriptados; donde, tras la autenticación (con nombre de usuario y contraseña), el backend encriptaría user_id, timestamp y un SHA-256 sobre ellos, la base 64 lo codificará y lo devolverá al cliente como token de acceso. De esta manera puedo eliminar la necesidad de un almacén de token persistente.
Esto es similar al esquema descrito en este artículo (aunque hay algunas diferencias).
La lógica que me gustaría tener, es que cuando el token se usa constantemente (es decir, el intervalo más largo entre las siguientes llamadas a la API no es más largo que N), no se debe solicitar al usuario la reautenticación .
El problema es que la validez del token cifrado no se puede extender, ya que cambiar la marca de tiempo significa que el valor de los cambios del token .
Puedo ver las siguientes soluciones:
1) Cada vez que se valida el token, emita un token nuevo y devuélvalo al cliente. En cada solicitud, el cliente se olvidaría del token anterior y almacenaría el nuevo en su lugar.
- + resuelve el problema
- La lógica + en el cliente es bastante sencilla
- - para un usuario, varios tokens serían válidos al mismo tiempo
2) Implementar un punto final de API que aceptaría un token caducado y emitiría un token nuevo a cambio. Este punto final tendría algún valor configurable M, por lo que si el token caduca en más de M, no se emitirá un nuevo token.
- + resuelve el problema
- + para un usuario, solo un token sería válido al mismo tiempo
- - la lógica en el cliente es un poco más complicada: necesita actualizar el token.
¿Hay otra solución, basada en tokens encriptados? (Sé que podemos solucionar ese problema con tokens regulares y persistentes).