OAuth 2.0 e autorização JWT em Kotlin: para iniciantes
As aplicações web e APIs modernas raramente funcionam sem um sistema de autenticação e autorização. Os dois padrões mais populares nesta área são OAuth 2.0 e JWT (JSON Web Token). Neste artigo, vamos abordar como implementar a autorização em Kotlin usando essas tecnologias. O material é voltado para desenvolvedores iniciantes familiarizados com os fundamentos da linguagem e do framework Spring Boot.
O que são OAuth 2.0 e JWT?
Antes de escrever código, é importante entender a teoria.
OAuth 2.0 é um protocolo de autorização que permite que aplicativos obtenham acesso limitado aos recursos do usuário sem transmitir login e senha. Imagine que você entra em um site através de "Entrar com Google" — isso é OAuth 2.0.
JWT é um formato de token compacto e autossuficiente. Ele consiste em três partes: cabeçalho (header), payload (payload) e assinatura (signature). O JWT é frequentemente usado junto com o OAuth 2.0 para transmitir informações de autenticação.
Principais fluxos do OAuth 2.0:
- Authorization Code Flow — para aplicações servidoras (o mais seguro)
- Client Credentials Flow — para comunicação servidor-servidor
- Implicit Flow — obsoleto, não recomendado
- Resource Owner Password Flow — apenas se você confiar no cliente
Neste artigo, vamos nos concentrar no Client Credentials Flow, pois é o mais fácil de entender e frequentemente usado em microsserviços.
Configuração do projeto Spring Boot em Kotlin
Vamos criar um novo projeto Spring Boot com suporte a Kotlin. Adicione as dependências necessárias no 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")}Essas dependências fornecem suporte para Spring Security, OAuth 2.0 Resource Server e a biblioteca JJWT para trabalhar com JWT.
Criação de tokens JWT em Kotlin
Vamos escrever um serviço para gerar e validar JWT. Esta é a base da nossa autorização.
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 }}Neste serviço, usamos uma chave simétrica. Em produção, é melhor usar criptografia assimétrica (RS256) e