Hay mucha información en la web sobre el uso de JWT ( Json Web Token
) para la autenticación. Pero todavía no encontré una explicación clara de cuál debería ser el flujo al usar tokens JWT para una solución de inicio de sesión único en un entorno de múltiples dominios .
Trabajo para una empresa que tiene muchos sitios en diferentes hosts. Usemos example1.com y example2.com . Necesitamos una solución de inicio de sesión único, lo que significa que si un usuario se autentica en example1.com , queremos que también se autentique en example2.com , automáticamente.
Al usar el flujo de OpenId Connect , entiendo que el usuario que desee autenticarse en example1.com será redirigido primero al servidor de autenticación (o OP
: "Proveedor de OpenId"). El usuario se autentica en ese servidor que luego lo redirige al sitio original example1.com con un token JWT firmado. (Entiendo que hay otro flujo que devuelve un token intermedio que se puede intercambiar por el token JWT real más adelante, pero no creo que esto sea necesario para nosotros) ...
¡Así que ahora el usuario está de vuelta en example1.com y está autenticado! Puede realizar solicitudes, pasando el token JWT en un Authentication
encabezado y el servidor puede verificar el JWT firmado y, por lo tanto, puede identificar al usuario. ¡Agradable!
Primera pregunta :
¿Cómo se debe almacenar el token JWT en el cliente? Hay, nuevamente, mucha información sobre esto, y la gente parece estar de acuerdo en que usar Web Storage
es el camino a seguir en lugar de lo bueno cookies
. Queremos que el JWT sea persistente entre los reinicios del navegador, así que usemos Local Storage
, no Session Storage
...
Ahora el usuario puede reiniciar su navegador y seguirá estando autenticado en example1.com , ¡siempre que el token JWT no esté vencido!
Además, si example1.com necesita realizar una solicitud Ajax a otro de nuestros dominios, entiendo que configurar CORS lo permitiría. Pero nuestro caso de uso principal no son las solicitudes entre dominios, ¡tiene una solución de inicio de sesión único !
Por tanto, la pregunta principal:
Ahora bien, ¿cuál debería ser el flujo, si el usuario va a example2.com y queremos que se autentique, utilizando el token JWT que ya tiene? Local Storage
no parece permitir el acceso entre dominios, por lo que en este punto el navegador no puede leer el token JWT para realizar solicitudes a example2.com .
Debería :
- ¿El usuario será redirigido nuevamente al servidor de autenticación ? Cuando el usuario se autenticó para example1.com , el servidor de autenticación puede haber configurado una cookie en el usuario, por lo que esta nueva solicitud de autenticación para example2.com podría usar esa cookie para ver que el usuario ya está autenticado e inmediatamente lo redirige a example2.com. con el mismo token JWT?
- ¿O puede el navegador, en example2.com , acceder al token JWT sin tener que volver al servidor de autenticación ? Veo que existen soluciones de almacenamiento cruzado , pero ¿se utilizan ampliamente? ¿Son la solución sugerida para un entorno SSO entre dominios?
No queremos nada lujoso, ¡estaríamos contentos con la solución más utilizada!