Introducción a OAuth 2.0 y JWT en Kotlin
Las aplicaciones web modernas y los servicios móviles requieren un sistema de autenticación y autorización robusto y seguro. Dos de los estándares más populares en este ámbito son OAuth 2.0 y JWT (JSON Web Token). En este artículo, analizaremos en detalle cómo implementar la autorización OAuth 2.0 y JWT en el lenguaje Kotlin utilizando el framework Spring Boot. Aprenderá a configurar un servidor de autorización, generar y verificar tokens, así como proteger sus endpoints de API.
Fundamentos de OAuth 2.0 y JWT
¿Qué es OAuth 2.0?
OAuth 2.0 es un protocolo de autorización que permite a aplicaciones de terceros obtener acceso limitado a los recursos de un usuario sin compartir sus credenciales (nombre de usuario y contraseña). En su lugar, se utiliza un token de acceso que se emite tras una autenticación exitosa. Los principales actores de OAuth 2.0 son:
- Resource Owner (propietario del recurso) — el usuario.
- Client (cliente) — la aplicación que solicita acceso.
- Authorization Server — el servidor que emite los tokens.
- Resource Server — el servidor que proporciona los datos protegidos.
¿Qué es JWT?
JWT (JSON Web Token) es un formato de token compacto y autónomo que contiene información sobre el usuario (claims) en forma de objeto JSON. El token se firma mediante una clave secreta o cifrado asimétrico, lo que garantiza su integridad. La estructura de JWT consta de tres partes separadas por puntos:
- Header — encabezado que contiene el tipo de token y el algoritmo de firma.
- Payload — carga útil con datos (por ejemplo, userId, role, exp).
- Signature — firma creada a partir del header y el payload.
Ejemplo de JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.ZL1mK9WpXoQ
Configuración del proyecto Kotlin con Spring Security
Adición de dependencias
Para empezar, crearemos un nuevo proyecto Spring Boot en Kotlin. En el archivo build.gradle.kts, agregue las siguientes dependencias:
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") implementation("com.h2database:h2")}Utilizamos la librería jjwt para trabajar con JWT y H2 como base de datos para pruebas.
Configuración de Security
Crearemos la clase SecurityConfig, que configurará Spring Security y deshabilitará el formulario de inicio de sesión estándar:
@Configuration@EnableWebSecurityclass SecurityConfig(private val jwtAuthFilter: JwtAuthFilter) {
@Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http .csrf { it.disable() } .authorizeHttpRequests { auth -> auth.requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter::class.java) return http.build() }}Permitimos el acceso a los endpoints /api/auth/** sin autenticación, mientras que todas las demás solicitudes requieren un token JWT.
Implementación de OAuth 2.0 y JWT en Kotlin
Generación y verificación de token JWT
Crearemos el servicio JwtService, que se encargará de la creación y