Proceso de autenticación y logado en aplicaciones usando keycloak en onesait Platform
Veamos un poco que es Keycloak, se trata una solución de código abierto para la gestión de identidades y accesos. Es una herramienta que permite a los desarrolladores agregar funciones de seguridad a sus aplicaciones con poco esfuerzo y sin tener que escribir código. Keycloak es compatible con los protocolos de autenticación y autorización más utilizados, como OpenID Connect, OAuth 2.0 y SAML 2.0. Además, Keycloak es compatible con los estándares de seguridad más recientes, como JSON Web Token (JWT) y Security Assertion Markup Language (SAML).
Keycloak se compone de dos partes principales: el servidor de autenticación y el servidor de administración. El servidor de autenticación es el que se encarga de la autenticación y autorización de los usuarios. El servidor de administración es el que se encarga de la administración de los usuarios, clientes, roles, etc. que está integrado en plataforma onesait.
Conceptos clave a la hora de integrar keycloak con aplicaciones onesait:
Para entender cómo funciona Keycloak es necesario conocer los siguientes conceptos:
Realm(reino): Un realm en Keycloak es un dominio de administración, esencialmente un espacio aislado donde se definen todos los usuarios, roles, clientes y otros aspectos relacionados con la seguridad. Al intentar autenticar un usuario, la aplicación o (“client”) hace referencia a un “realm” específico, garantizando que solo las configuración y permisos de ese “realm” sean aplicables.
Claim: Un “claim” es una declaración o atributo sobre un usuario. Por ejemplo, el nombre de usuario, la dirección de correo electrónico o el rol pueden ser “claims”. Cuando un usuario se autentica exitosamente, Keycloak genera un token de autenticación que puede contener varios “claims”, proporcionando información sobre el usuario autenticado. Se puede necesitar si la aplicación necesita campos adicionales para la gestión y parametrización de la app.
Client(cliente): Un “client” en Keycloak se refiere a una aplicación o servicio que desea autenticar a un usuario. Al configurarse con Keycloak, básicamente se registra dentro de un “realm” específico. Cada “Client” puede tener roles asociados, lo que permite determinar que usuarios tienen acceso y qué permisos se les otorgan. Es lo que se usa para en el momento de la autenticación indicar a keycloak contra qué realm y de qué forma vamos a realizar la autenticación.
Roles: Los roles definen ciertos privilegios o permisos para los usuarios. Dentro de un “realm”, puedes tener roles que se aplican a varios “clients” o roles específicos para un “client” en particular. Al autenticar a un usuario, Keycloak verifica qué roles tiene asignados y, basándose en eso, decide qué “claims” incluir en el token de autenticación, dictando así los permisos del usuario en la aplicación. Los roles de plataforma se mapean con los roles de realm de forma automática al igual que un client que se crea a partir del Realm.
Proceso de autenticación con Keycloak
Si tenemos una aplicación que realiza el proceso de autenticación contra la plataforma onesait, y queremos pasar a realizarlo vía keycloak, además de la configuración en plataforma de keycloak tendremos que instalar la parte front en la aplicación encargada de lanzar la autenticación y recoger el token para continuar con el proceso de logado en la app y continuar con la carga con las necesidades de cada aplicación.
Para entender el proceso vamos a ver como una de nuestras aplicaciones hace este proceso, usamos la librería estándar de keycloak para js (keycloak-js) en un entorno desarrollado con vuejs.
https://www.npmjs.com/package/keycloak-js
https://github.com/keycloak/keycloak
Para realizar el setup de la autenticación usamos la lib. y configuramos la misma de una forma sencilla, indicando el path, el realm y el client que vamos a utilizar en la autenticación (main.js) de una app VUE:
Como podemos ver, hay unas initOptions que parametrizan cómo se va a realizar la autenticación, en realm y el client serán los que utilice la aplicación y se hayan previamente configurado en la plataforma.
Podemos Luego el proceso es sencillo, se crea una nueva instancia de keycloak (línea 13), se lanza la función init para iniciar el proceso de autenticación (línea 14) si hay autenticación se guarda la información y se continua con el flujo normal, sino se recarga de nuevo la misma ubicación (líneas 15 – 21). En este caso se guarda el token (vue-token) y el token de validación de refresco para saber el tiempo de validez (vue-refresh-token)
El proceso hará lo siguiente:
Carga inicial, lectura de las opciones de keycloak y lanzamiento de la plantilla de login
Se realiza el login allí, entonces:
a. Si es incorrecto, volverá a carga la misma página para realizar el login de nuevo.
b. Si es correcto, keycloak redirige de nuevo a la página desde donde hemos empezado (normalmente sería al antiguo login de la app, que ahora está preparado para recibir el token) o bien otra nueva página preparada para ello.
Se reciben los tokens que normalmente se almacenarán y a partir de ahí se recoge la información necesaria y se continua con la carga habitual de la aplicación (justo igual que después de hacer el logado contra plataforma que antes de keycloak hacíamos)
Es en esta parte de la recepción de los tokens si tenemos que extraer información del usuario, rol etc.. tendremos que coger el token y explotar su información:
Un ejemplo de cómo decodificar un token y sacar la información, primero, hacemos una fn. implícita (línea 3) y segundo, la usamos con el token recibido de la autenticación (línea 9) a partir de ahí seguimos con el flujo normal de la app haciendo lo que la aplicación necesite realizar.
Otro proceso necesario suele ser pasar el token de autenticación para usar en los servicios REST que la aplicación vaya a consumir, cosa que podemos ver en varios ejemplos aquí (línea 6) actualización vía store y (línea 15) actualización a servicios (axios) o cualquier tipo de servicios XMLHttpRequests
Finalmente, a la hora de hacer el logOut, también tenemos que cambiar la forma de hacerlo, ya que tenemos que invocar de nuevo a keycloak para que lo realice correctamente:
Revisar más documentación en los siguientes enlaces:
Un Vistazo a Keycloak como Identity Manager - Portal del Desarrollador - La plataforma de Indra