Introducción a OAuth 2.0 y JWT en Java
Las aplicaciones web y API modernas requieren mecanismos robustos de autenticación y autorización. Los dos estándares más populares en este ámbito son OAuth 2.0 y JWT (JSON Web Tokens). Si eres un desarrollador Java principiante, comprender estas tecnologías te abrirá el camino para crear aplicaciones seguras y escalables.
En este artículo, analizaremos qué son OAuth 2.0 y JWT, cómo funcionan juntos y cómo implementarlos en Java utilizando bibliotecas populares. Aprenderás a configurar un servidor de autorización, generar y verificar tokens JWT, así como proteger tus API REST.
¿Qué son OAuth 2.0 y JWT?
OAuth 2.0 — protocolo de acceso delegado
OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos de un usuario sin transferir sus credenciales. Imagina que quieres darle a una aplicación acceso a tus fotos en Google. En lugar de proporcionar tu contraseña de Google a la aplicación, usas OAuth 2.0, que emite un token temporal con permisos limitados para la aplicación.
Participantes principales de OAuth 2.0:
- Resource Owner — el usuario propietario de los recursos
- Client — la aplicación que solicita acceso
- Authorization Server — el servidor que emite los tokens
- Resource Server — el servidor que proporciona los recursos protegidos
JWT — formato compacto de token
JWT (JSON Web Token) es un estándar abierto (RFC 7519) para crear tokens de acceso que contienen afirmaciones (claims) en formato JSON. JWT consta de tres partes separadas por puntos:
- Header — contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256 o RS256)
- Payload — contiene las afirmaciones (por ejemplo, ID de usuario, roles, fecha de expiración)
- Signature — firma que garantiza la integridad del token
Ejemplo de JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Implementación de OAuth 2.0 y JWT en Java
Configuración del proyecto con Spring Security
Para implementar OAuth 2.0 y JWT en Java, utilizaremos Spring Boot y Spring Security. Comenzamos agregando las dependencias en el archivo pom.xml:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.12.3</version></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.12.3</version> <scope>runtime</scope></dependency>Creación del proveedor JWT
Crearemos la clase JwtProvider, que se encargará de la generación y validación de tokens JWT:
import io.jsonwebtoken.*;import io.jsonwebtoken.security.Keys;import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;import java.util.Date;
@Componentpublic class JwtProvider { private final SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256); private final