Cómo generar JWT con Auth0 en Spring Boot

Resumen

Si estás construyendo una API stateless en Spring Boot, los JSON Web Tokens son la pieza que reemplaza la autenticación con sesiones. Aquí verás cómo integrar la librería de Auth0 en un proyecto Java con Gradle y escribir el código que genera un token firmado para un usuario autenticado.

Esto te sirve si trabajas backend con Spring Security y necesitas emitir tokens válidos para que tus clientes consuman endpoints protegidos.

¿Qué es un JSON Web Token y cómo funciona en una API stateless?

Un JWT es un estándar abierto basado en JSON que sirve para crear tokens de seguridad. Cuando un usuario inicia sesión, la aplicación valida sus credenciales y, si son correctas, devuelve un token que el cliente debe enviar en el encabezado Authorization de cada petición [01:00].

A diferencia de la autenticación Basic, que usa el prefijo Basic, los JWT viajan con el prefijo Bearer seguido de un espacio y el token.

¿Qué significa que una API sea stateless? Que el servidor no guarda información de sesión entre peticiones. Cada request lleva su propio token con toda la información necesaria para autenticar al usuario.

¿Cuáles son las tres secciones de un JWT?

La estructura de un JSON Web Token siempre es la misma y se divide en tres partes [01:45]:

  • Header: contiene alg, el algoritmo de encripción, y typ, el tipo de token (normalmente JWT).
  • Payload: incluye la información del token. Trae claims estándar como el emisor, fecha de creación, fecha de expiración, fecha desde la cual es válido y el sujeto. También admite parámetros personalizados.
  • Signature: toma header y payload, los encripta junto con una palabra clave secreta y produce la firma. Si alguien modifica el token, la firma deja de ser válida.

¿Cómo agregar la librería Auth0 JWT a un proyecto Gradle?

La librería que vas a usar es la oficial de Auth0, listada en JWT.io dentro de las opciones para Java [03:00]. Trabajarás con la versión 4.3 publicada en Maven Central.

Abre tu archivo build.gradle y agrega la dependencia debajo de la de seguridad. Después refresca la configuración de Gradle para que descargue los artefactos.

gradle implementation 'com.auth0:java-jwt:4.3.0'

¿Por qué elegir la implementación de Auth0? Porque tiene el respaldo de una empresa grande especializada en identidad y autenticación, lo que se traduce en mantenimiento activo y documentación clara.

¿Cómo escribir una clase utilitaria para crear JWT en Spring Boot?

Dentro de la capa web, en el paquete config, crea una clase llamada JsonWebTokenUtils y anótala con @Component para que Spring la administre dentro de su ciclo de vida e ingrese al contenedor de inyección de dependencias [04:30].

En esa clase necesitas dos atributos privados estáticos: una secretKey con el valor Platzi_pizza y un algorithm construido con HMAC256 usando esa misma clave. Esa palabra clave es la que protege la firma del token.

¿Qué claims debe incluir el método create?

El método create recibe un username y devuelve un String con el JWT firmado. Estos son los claims que vas a configurar:

  • withSubject(username): identifica al usuario para quien se emite el token.
  • withIssuer("Platzi Pizza"): indica quién emite el token.
  • withIssuedAt(new Date()): fija la fecha de creación con la fecha actual.
  • withExpiresAt: define la expiración. Aquí se calcula con System.currentTimeMillis() más TimeUnit.DAYS.toMillis(15) para que el token dure 15 días [06:30].
  • sign(algorithm): firma el token con el algoritmo HMAC256 y devuelve el String final.

java @Component public class JsonWebTokenUtils {

private static String secretKey = "Platzi_pizza"; private static Algorithm algorithm = Algorithm.HMAC256(secretKey); public String create(String username) { return JWT.create() .withSubject(username) .withIssuer("Platzi Pizza") .withIssuedAt(new Date()) .withExpiresAt(new Date(System.currentTimeMillis() + TimeUnit.DAYS.toMillis(15))) .sign(algorithm); }

}

Con esa clase ya tienes la lógica lista para emitir tokens. El siguiente paso natural es construir un controlador de login que valide credenciales y devuelva este JWT como respuesta al usuario autenticado.

¿Qué claim personalizado le agregarías tú a este token para tu caso de uso? Cuéntalo en los comentarios.