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 También en la biblioteca
Generación de Swagger/OpenAPI para Go (Golang): guía completa
Micrometer en Java: guía completa con ejemplos prácticos
Validación de datos en PHP: Guía completa sobre herramientas y bibliotecas
Generación de informes PDF en JavaScript (Node.js): Puppeteer, PDFKit, jsPDF