OAuth 2.0 y autorización JWT en Kotlin: para principiantes
Las aplicaciones web y las API modernas rara vez prescinden de un sistema de autenticación y autorización. Los dos estándares más populares en este ámbito son OAuth 2.0 y JWT (JSON Web Token). En este artículo, analizaremos cómo implementar la autorización en Kotlin utilizando estas tecnologías. El material está dirigido a desarrolladores principiantes familiarizados con los conceptos básicos del lenguaje y el framework Spring Boot.
¿Qué son OAuth 2.0 y JWT?
Antes de escribir código, es importante comprender la teoría.
OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin transmitir su nombre de usuario y contraseña. Imagina que inicias sesión en un sitio web mediante "Iniciar sesión con Google"; eso es OAuth 2.0.
JWT es un formato de token compacto y autónomo. Consta de tres partes: encabezado (header), carga útil (payload) y firma (signature). JWT se utiliza a menudo junto con OAuth 2.0 para transmitir información de autenticación.
Flujos principales de OAuth 2.0:
- Authorization Code Flow — para aplicaciones de servidor (el más seguro)
- Client Credentials Flow — para comunicación servidor a servidor
- Implicit Flow — obsoleto, no recomendado
- Resource Owner Password Flow — solo si confías en el cliente
En este artículo nos centraremos en el Client Credentials Flow, ya que es el más fácil de entender y se utiliza a menudo en microservicios.
Configuración del proyecto Spring Boot en Kotlin
Crearemos un nuevo proyecto Spring Boot con soporte para Kotlin. Añadiremos las dependencias necesarias en build.gradle.kts:
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server") 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.fasterxml.jackson.module:jackson-module-kotlin")}Estas dependencias proporcionan soporte para Spring Security, OAuth 2.0 Resource Server y la biblioteca JJWT para trabajar con JWT.
Creación de tokens JWT en Kotlin
Escribiremos un servicio para generar y validar JWT. Esta es la base de nuestra autorización.
import io.jsonwebtoken.Jwtsimport io.jsonwebtoken.SignatureAlgorithmimport io.jsonwebtoken.security.Keysimport org.springframework.stereotype.Serviceimport java.util.Date
@Serviceclass JwtService { private val secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256) private val expirationMs = 3600000L // 1 hora
fun generateToken(clientId: String): String { val now = Date() val expiryDate = Date(now.time + expirationMs)
return Jwts.builder() .setSubject(clientId) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(secretKey) .compact() }
fun validateToken(token: String): Boolean { return try { Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) true } catch (e: Exception) { false } }
fun getClientIdFromToken(token: String): String { val claims = Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .body return claims.subject }}En este servicio utilizamos una clave simétrica. En producción, es mejor usar cifrado asimétrico (RS256) y