OAuth 2.0 y autorización JWT en Kotlin: guía paso a paso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Blogs

Book Recommendations