Introducción a OAuth 2.0 y JWT en Java
\n\nLas aplicaciones web y las API modernas rara vez prescinden de mecanismos de autenticación y autorización. Los dos estándares más populares en esta área son OAuth 2.0 y JWT (JSON Web Token). Si eres un desarrollador Java principiante, comprender estas tecnologías te abrirá el camino para crear sistemas seguros y escalables.
\n\nOAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin transferir sus credenciales. JWT, a su vez, es un formato de token compacto que se utiliza para transferir afirmaciones (claims) entre partes. En este artículo, analizaremos cómo combinar estas tecnologías en una aplicación Java utilizando Spring Security y bibliotecas populares.
\n\nFundamentos de OAuth 2.0: cómo funciona
\n\nOAuth 2.0 define varios roles de participantes en la interacción:
\n\n- \n
- Resource Owner — el usuario propietario de los datos protegidos \n
- Client — la aplicación que solicita acceso \n
- Authorization Server — el servidor que emite tokens después de la autenticación \n
- Resource Server — el servidor que almacena los recursos protegidos \n
La idea principal del protocolo es que el cliente obtiene un token de acceso temporal que presenta al servidor de recursos. El escenario más común es el Authorization Code Flow, que se utiliza en aplicaciones web.
\n\nEjemplo de configuración de un cliente OAuth 2.0 en Spring Boot
\n\nAgregue la dependencia en pom.xml:
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n\nConfigure application.yml para trabajar con Google OAuth 2.0:
spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: YOUR_CLIENT_ID\n client-secret: YOUR_CLIENT_SECRET\n scope:\n - email\n - profile\n\nAhora Spring Security manejará automáticamente la redirección a la página de inicio de sesión de Google y devolverá el token de acceso.
\n\nJWT: estructura y creación del token
\n\nJWT consta de tres partes separadas por puntos:
\n\n- \n
- Header — contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256) \n
- Payload — contiene las afirmaciones (claims): datos del usuario, fecha de caducidad, rol \n
- Signature — firma creada a partir del encabezado y la carga útil utilizando una clave secreta \n
Para trabajar con JWT en Java, la biblioteca más utilizada es jjwt. Agregue la dependencia:
\n\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.5</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n\nCreación de un token JWT en Java
\n\nAquí hay un ejemplo de una clase para generar y validar JWT:
\n\nimport io.jsonwebtoken.*;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n\n private final SecretKey secretKey = Keys.hmacShaKeyFor(\n "my-secret-key-which-should-be-at-least-256-bits-long".getBytes()\n );\n\n public St