Actualmente estoy trabajando en un PoC con múltiples servicios Quarkus y Keycloak RBAC. Funciona de maravilla, fácilmente para arrancar y comenzar a implementar funciones.

Pero encontré un problema que no podía resolver en mi mente. Imagina:

  1. El usuario accede a un servicio protegido
  2. La extensión quarkus-oidc hace la obtención de tokens de fantasía por redireccionamiento HTTP, JWT en cookie dura 30 minutos
  3. El usuario se autentica y vuelve a la aplicación web
  4. El usuario trabaja en la aplicación, llena formularios y datos
  5. Los datos se almacenan mediante llamadas REST enriquecidas con JWT (validamos con hibernate-validator)
  6. La usuaria vuelve a trabajar, tardando más de 30 min.
  7. Quiere almacenar otra entrada, pero el token del paso 3 ahora expiró y la llamada a la API falla
  8. El usuario no será feliz, así que yo tampoco

Posibles formas de resolver:

  1. Hacer que el JWT dure más que los 30 minutos actuales, pero eso solo pospone el problema y abre algunas puertas de seguridad
  2. Almacenar la entrada de los usuarios en el almacenamiento local para restaurarla más tarde después de una actualización de token (también haríamos eso para no perder el trabajo de los usuarios)
  3. Actualice el token "silenciosamente" en JS sin que el usuario lo sepa. ¿Hay alguna práctica recomendada para eso?
  4. Me perdí algo importante e Internet ahora me dice una mejor arquitectura para mi aplicación.

Gracias internet!

1
mvoelkl 30 abr. 2020 a las 13:54

2 respuestas

Para tales casos de uso, tiendo a preferir el reverso de JWT. Mantengo los datos del usuario en un servicio de datos compartidos (una cuadrícula de datos como Infinispan o Redis). Para que el usuario ingrese estos datos y esté disponible. Yo controlo el TTL de esos datos en el servicio de datos compartidos.

Puede ser específico de una aplicación o compartido entre un pequeño número de aplicaciones. Trae algo de acoplamiento, pero también lo hace la estructura de propiedades JWT.

Para Quarkus, hay una integración de cliente Infinispan, una Hazelcast, mongodb y AWS dynamoDB. Y puedes traer otras bibliotecas.

0
Emmanuel Bernard 30 abr. 2020 a las 12:30

Vuelva al paso 3. En Quarkus 1.5.0, al agregar quarkus.oidc.token.refresh-expired=true se actualizará el token de ID y la sesión del usuario se ampliará si la concesión de actualización ha tenido éxito

1
Sergey Beryozkin 30 abr. 2020 a las 12:50