Tokens JWT en Kotlin: Guía completa con ejemplos de código

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

Tokens JWT en Kotlin: Guía completa para desarrolladores



JSON Web Token (JWT) es un formato compacto y seguro para URL que se utiliza para transmitir afirmaciones (claims) entre dos partes. En el ecosistema de Kotlin, JWT se usa ampliamente para autenticación, autorización e intercambio de datos en microservicios, aplicaciones móviles y aplicaciones web en Ktor o Spring Boot. En este artículo, analizaremos cómo crear, firmar y verificar tokens JWT en Kotlin utilizando bibliotecas populares: JJWT (Java JWT) y Auth0 java-jwt.



¿Qué es JWT y por qué es necesario en Kotlin?

JWT consta de tres partes: encabezado (header), carga útil (payload) y firma (signature). En Kotlin, los tokens JWT permiten:

  • Implementar autenticación sin estado (stateless) (el servidor no almacena sesiones).
  • Transmitir roles y permisos de acceso (claims).
  • Trabajar con sistemas distribuidos y API.
  • Integrarse con OAuth2 y OpenID Connect.


Instalación de bibliotecas para trabajar con JWT en Kotlin

Para proyectos Kotlin/JVM, las dos bibliotecas más adecuadas son: io.jsonwebtoken:jjwt (JJWT) y com.auth0:java-jwt. Agregue las dependencias en build.gradle.kts:



// build.gradle.ktsdependencies {    // JJWT (recomendado)    implementation("io.jsonwebtoken:jjwt-api:0.12.6")    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6") // para JSON

// Auth0 java-jwt implementation("com.auth0:java-jwt:4.4.0")}


Creación de un token JWT con JJWT (Kotlin)

JJWT proporciona una API fluida y limpia. A continuación se muestra un ejemplo de creación de un token con firma HMAC-SHA256:



import io.jsonwebtoken.Jwtsimport io.jsonwebtoken.SignatureAlgorithmimport io.jsonwebtoken.security.Keysimport java.util.Date

fun createJwtToken(userId: String, role: String): String { val secretKey = Keys.hmacShaKeyFor("my_secret_key_32_bytes_long!!".toByteArray())

val token = Jwts.builder() .setSubject(userId) .claim("role", role) .setIssuedAt(Date()) .setExpiration(Date(System.currentTimeMillis() + 3600_000)) // 1 hora .signWith(secretKey, SignatureAlgorithm.HS256) .compact()

return token}


Verificación y análisis de un token JWT

Para validar el token, use Jwts.parserBuilder(). Ejemplo de verificación con extracción de claims:



import io.jsonwebtoken.Jwtsimport io.jsonwebtoken.security.Keys

fun validateToken(token: String): Map<String, Any>? { return try { val secretKey = Keys.hmacShaKeyFor("my_secret_key_32_bytes_long!!".toByteArray()) val claims = Jwts.parserBuilder() .setSigningKey(secretKey) .build() .parseClaimsJws(token) .body

claims } catch (e: Exception) { println("Token inválido: ${e.message}") null }}


Trabajar con JWT mediante Auth0 java-jwt (Kotlin)

La biblioteca Auth0 también es popular. Ejemplo de creación y verificación de un token con firma RSA:



import com.auth0.jwt.JWTimport com.auth0.jwt.algorithms.Algorithmimport com.auth0.jwt.interfaces.DecodedJWTimport java.security.interfaces.RSAPrivateKeyimport java.security.interfaces.RSAPublicKeyimport java.util.Date

// Generación de tokenfun createRsaToken(userId: String, privateKey: RSAPrivateKey): String { val algorithm = Algorithm.RSA256(null, privateKey) return JWT.create() .withSubject(userId) .withIssuer("auth0") .withExpiresAt(Date(System.currentTimeMillis() + 3600_000)) .sign(algorithm)}

// Verificación de tokenfun verifyRsaToken(token: String, publicKey: RSAPublicKey): DecodedJWT? { return try { val algorithm = Algorithm.RSA256(publicKe

Recommendations