JWT es el acrónimo de JSON Web Token y en esencia es un estándar para hacer autenticación de token de forma segura y confiable.

Con JWT podemos firmar digitalmente información para poder posteriormente verificar el mensaje enviado con una clave secreta.

¿Y para qué queremos autenticación por token?

Tradicionalmente las aplicaciones persisten la identidad a través de cookies de sesión.

La autenticación por token es un enfoque más moderno, diseñado para resolver problemas que la identificación de sesión del servidor no pueden. En este enfoque los tokens se generan para los usuarios tras presentar credenciales verificables. La autenticación inicial podría ser por credenciales de nombre de usuario / contraseña, claves API o incluso tokens de otro servicio.

Anatomía de un JWT

JWT está dividido en 3 secciones, el encabezado, el payload y la firma, separados por un .:

En el ejmplo, la Sección 1 es un encabezado que describe el token. La Sección 2 es el payload, que contiene la petición JWT, y la Sección 3 es el hash de firma que puede usarse para verificar la integridad del token (si tiene la clave secreta que se utilizó para firmarlo).

Cuando decodificamos este payload obtenemos este objeto JSON que contiene:

}

Al menos:

· claim sub: Quién esta persona y la URL al ususario

· claim scope: a qué puede acceder este usuario

· claim exp: cuando expira el token

¿Cómo usarlo en Java?

Existen varias librerías para trabajar con JWT en Java, aunque probablemente la más usada sea JJWT (Java JWT) del equipo de Stormpath.

JJWT es una implementación open-source (Apache) de JWT, JWS, JWE, JWK and JWA RFC specifications y permite manejar JWT end-to-end: creación y vertificación.

JJWT tiene un interfaz fluido, para crear un JWT seguiré 3 pasos:

  1. La definición de los claims internos del token, como Issuer, Subject, Expiration, and ID.
  2. El firmado criptográfico del JWT (JWS)
  3. El compactado del JWT a una URL segura conforme las reglas JWT Compact Serialization

El JWT final es una cadena codificada en Base64 con 3 partes.

Validación

Una vez tenemos el JWT normalmente se devuelve al cliente que lo solicitó. El cliente lo almacena y pasa el Token en las solicitudes a su aplicación.

Esto generalmente se hace con un valor de cookie o un encabezado de autorización en HTTP.

Por ejemplo:

La validación del JWT permite verificar su autenticidad (comprobando su firma digital puede comprobar que no ha caducado y verificar que no se ha alterado) y obtener información sobre el usuario que envía el token He aquí un ejemplo de validación del JWT que hemos creado anteriormente:

Si la firma es incorrecta, la llamada a parseClaimsJws lanzará una excepción SignatureException. Una vez analizado con éxito, las reivindicaciones individuales pueden obtenerse y comprobarse como en: String scope = claims.getBody (). Get (“scope”)