Autenticación con JSON Web Tokens

JSON Web TokensLos JSON Web Tokens (JWT) se ha convertido rápidamente en un estándar en la autenticación de aplicaciones, pues permite de una forma simple y elegante identificarte con el servidor mediante un Token. Dicho token es generado por el servidor y es transmitido hacia el cliente, el cual deberá presentar en cada invocación para poder ser autenticado.

 

Que es un Token

 

Lo primero que debemos de entender, es que es un token, pues será un concepto fundamental para entender el resto del artículo.

Un token es una cadena alfanumérica con caracteres aparentemente aleatorios, como el siguiente:

o el siguiente:

Estas cadenas de texto, pueden no aparentar un significado, sin embargo, tiene un significado real para el servidor o institución que lo emitió, el cual puede entender y así, validar al usuario que intenta acceder a la información, e incluso, puede tener datos adicionales.

Un caso simple de tokens, es el dispositivo que dan los bancos para realizar transacciones desde internet, este token te genera un valor numérico que luego tenemos que ingresar al sistema, para que de esta forma, el portal pueda asegurarse de que efectivamente somos nosotros y no un impostor.

 

En el caso de los tokens bancarios, no se almacena una información real dentro del Token, sino que simplemente es un valor generado que luego puede ser validado por el banco como un valor real generado por nuestro token. Sin embargo, con JWT podemos enviar cualquier dato del cliente dentro del token para que el servidor pueda obtener mucha más información de nosotros.

 

Que son los JSON Web Tokens

 

Bien, una vez que comprendemos que son los Tokens podemos decir que los JWT son un tipo de token el cual engloba una estructura, la cual puede ser desencriptada por el servidor y de esta forma, autenticarnos como usuario en la aplicación.

 

Veamos la estructura de un JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Observemos que la cadena está dividida en 3 secciones separadas por un punto. Estas tres secciones tienen un significado:

  1. HEADER: la primera parte, corresponde a los Header, y se almacena por lo general el tipo de token y el algoritmo de encriptamiento.
  2. PAYLOAD: La segunda parte, contiene los datos que identifican al usuario, como puede ser su ID, nombre de usuario, etc.
  3. FIRMA: La tercera parte es la firma digital, la cual se genera con las secciones anteriores y sirve para validar que el contenido no allá sido alterado.

 

Ejemplo del Header

 

 

Ejemplo del Payload

 

La firma por otra parte es el header y el payload en base64 y después encriptado.

 

Puedes leer más de JWT en su página oficial

 

Como se utiliza los JWT

 

Como ya hablamos, los JWT se utilizan para autenticar a los usuarios, para ello, el usuario requiere de un login tradicional como es el usuario y password. Una vez, que el sistema de Backend valida que el usuario y contraseña son correctos, este retorna un token al usuario. Este token lo deberá guardar el cliente, pues de aquí en adelante, todas las peticiones que realice al servidor, deberá llevar el token.

JWT JSON Web Token

 

El token es por lo general almacenado en Cookies o en el LocalStorage del navegador, y cuando es requerido enviar un request al servidor, se recupere y se envía como header.

 

Un dato interesante del token es que no requiere que el servidor lo almacene para compararlos cuando lo envíe el cliente, pues el token por si solo puede ser auto validado, y como tiene un payload, es posible determinar de quien es el token. Veamos el siguiente payload:

 

Cuando el servidor desencripte el token, podrá recuperar este payload y con ello, podrá saber que usuario es e incluso, es posible guardar datos adicionales como el rol o cualquier dato en formato JSON.

Otro dato interesante del token es que expira, es decir, el token solo es válido por un tiempo determinado. Por lo que el usuario deberá volverse a logear una vez que el token expire.

 

Veamos cómo funcionaría todo el ciclo de vida de un JWT

 

Ya hemos hablado de como JWT funciona, pero ahora entraremos a ver como es la interacción que tiene un usuario al autenticarse por medio de JWT, para lo cual veamos la siguiente imagen:

JWT JSON Web Token-lifecycle

Los pasos son los siguientes:

  1. El usuario requiere de una autenticación tradicional con el servidor, es decir usuario y password (o cualquier otro tipo de autenticación).
  2. El servidor validará que los datos introducidos sean correctos y generará un Token.
  3. El servidor enviará el token al usuario y este lo tendrá que almacenar de cualquier forma.
  4. Una vez con el token, el usuario realiza una petición al servidor, enviando en el header el token previamente generado.
  5. El servidor validará que el token sea correcto, desencriptandolo mediante la misma llave que utilizo para encriptarlo.
  6. Si el token es correcto, entonces el servidor retornará los datos solicitados.

 

Cabe mencionar que los puntos 4,5 y 6 se pueden repetir indeterminado número de veces hasta que el token caduque, cuando esto pase, entonces será necesario reiniciar desde el paso 1.

 

Como implementar un JWT

 

Existe una serie de librerías que nos permite crear un JWT, y todo dependerá del lenguaje que utilicemos. Sin embargo, quiero mostrarte como crear un JWT con NodeJS.

 

Lo primero, es que será necesario importar el módulo jsonwebtoken:

npm install –save jsonwebtoken

 

Generación del Token

 

ya con la dependencia instalada podemos crear el token de la siguiente manera:

 

 

Lo primero que haremos será crear una función que reciba el objeto usuario o cualquier otro objeto que contenga la información requerida para la autenticación. Luego mediante el objeto usuario, creamos el objeto u, el cual solo contiene el username y el ID del usuario. Este objeto se convertirá en el payload del JWT, es decir la segunda parte del token.

Seguido, procedemos a crear el token mediante el módulo jwt, el cual nos proporciona el método sign que recibirá el payload y un password, este password deberá ser secreto, pues con él, podremos crear y desencriptar los tokens. Finalmente, el tercer parámetro son las opciones, aquí podremos seleccionar el algoritmo de encriptación, la fecha de expiración, etc.  En este ejemplo dejamos la configuración por default, pero agregamos que el token sea válidos solo por 24 horas.

Finalmente, el token es retornado al cliente.

 

Validación del token

 

Hasta este punto solo hemos visto la parte de la generación del Token, pero falta la segunda parte, en donde tenemos que validar que el Token que el cliente nos manda, es válido.

Para validar el Token podemos utilizar un Middleware de Express que valide de forma automática todas las URL que inicien con /secure. El middleware se ve de la siguiente manera:

 

 

Podemos ver que en la primera llínea inicializa el middleware, luego en la segunda línea obtenemos el token del header authorization”. Si el token es Null regresamos un 401 indicando que no el cliente no tiene privilegios.

Los token generados por JWT se crean con la palabra “Bearer” al inicio del token, por lo que en la línea 10 quitamos esa parte del token, seguido, en la línea 12 realizamos la validación del token mediante el método verify.

Este método recibe el token como primer parámetro, como segundo parámetro, mandamos el password para desencriptar el token. Finalmente se envía como tercer parámetro una función Callback una vez que el token sea validado.

Si todo salió bien, el token estará en la variable token, en caso contrario, tendremos el error en la variable err.

 

Conclusiones

 

Como pudimos ver, los tokens son una magnifica forma de administrar la autenticación de los usuarios, pues permite crear de forma fácil, un mecanismo para comunicarse de forma segura entre el cliente y el servidor, además, de que permite mantener autenticado a un usuario por un tiempo determinado, evitando tener que iniciar sesión cada vez que entre a nuestra aplicación.

Artículos relacionados

JSON vs XML En esta entrada quisiera hacer una comparativa entre JSON vs XML ya que en varias ocasiones me ha tocado discutir cual es mejor que la otra y siempre ...
Seguridad – Confidencialidad, Integridad y A... Cada día las aplicaciones tiene mayor necesidad de intercambiar mensajes con el fin de integrar aplicaciones o de comunicar algo a otras aplicacione...
Introducción a NodeJS (JavaScript del lado del Ser... NodeJS es sin duda una de las tecnologías que más rápido está creciendo, y que ya hoy en día es indispensable para cubrir posiciones de trabajo. NodeJ...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

3 comentarios en “Autenticación con JSON Web Tokens

      1. Hola Miguel,

        Esa es una muy buena pregunta. Primero que nada, si es posible utilizar JWT entre servicios. Claramente, el servicio al que te conectas debe de emitir el token, y en cada invocación de los clientes, estos, deben de enviar el token.

        Lo único a considerar, es tener cuidado con la expiración de los tokens, pues entre servicios no existe el login, por lo que tienes dos opciones, y le pones que nunca caduca, o debes detener cuidad de actualizar el token antes que caduque, pues si no, van a fallar todas las ejecuciones.

        Espero que esto resuelva tu duda.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *