Tokens JWT em Kotlin: Guia Completo para Desenvolvedores
JSON Web Token (JWT) é um formato compacto e seguro para URL, usado para transmitir declarações (claims) entre duas partes. No ecossistema Kotlin, o JWT é amplamente utilizado para autenticação, autorização e troca de dados em microsserviços, aplicativos móveis e aplicações web com Ktor ou Spring Boot. Neste artigo, vamos abordar como criar, assinar e verificar tokens JWT em Kotlin usando bibliotecas populares: JJWT (Java JWT) e Auth0 java-jwt.
O que é JWT e por que usá-lo em Kotlin?
O JWT consiste em três partes: cabeçalho (header), carga útil (payload) e assinatura (signature). Em Kotlin, os tokens JWT permitem:
- Implementar autenticação stateless (o servidor não armazena sessões).
- Transmitir papéis e permissões de acesso (claims).
- Trabalhar com sistemas distribuídos e APIs.
- Integrar-se com OAuth2 e OpenID Connect.
Instalação de bibliotecas para trabalhar com JWT em Kotlin
Para projetos Kotlin/JVM, duas bibliotecas são as mais indicadas: io.jsonwebtoken:jjwt (JJWT) e com.auth0:java-jwt. Adicione as dependências no 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")}Criação de um token JWT com JJWT (Kotlin)
O JJWT fornece uma API fluente e limpa. Abaixo está um exemplo de criação de token com assinatura 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}Verificação e análise de um token JWT
Para validar o token, use Jwts.parserBuilder(). Exemplo de verificação com extração 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 }}Trabalhando com JWT via Auth0 java-jwt (Kotlin)
A biblioteca Auth0 também é popular. Exemplo de criação e verificação de token com assinatura 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
// Geração do 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)}
// Verificação do tokenfun verifyRsaToken(token: String, publicKey: RSAPublicKey): DecodedJWT? { return try { val algorithm = Algorithm.RSA256(publicKe