Introdução ao OAuth 2.0 e JWT em Kotlin
Aplicações web modernas e serviços móveis exigem um sistema robusto e seguro de autenticação e autorização. Dois dos padrões mais populares nesta área são OAuth 2.0 e JWT (JSON Web Token). Neste artigo, vamos detalhar como implementar a autorização OAuth 2.0 e JWT na linguagem Kotlin usando o framework Spring Boot. Você aprenderá como configurar um servidor de autorização, gerar e validar tokens, além de proteger seus endpoints de API.
Fundamentos de OAuth 2.0 e JWT
O que é OAuth 2.0?
OAuth 2.0 é um protocolo de autorização que permite que aplicativos de terceiros obtenham acesso limitado aos recursos de um usuário sem transmitir suas credenciais (login e senha). Em vez disso, utiliza-se um token de acesso, emitido após a autenticação bem-sucedida. Os principais participantes do OAuth 2.0 são:
- Resource Owner (proprietário do recurso) — o usuário.
- Client (cliente) — o aplicativo que solicita o acesso.
- Authorization Server — o servidor que emite os tokens.
- Resource Server — o servidor que fornece os dados protegidos.
O que é JWT?
JWT (JSON Web Token) é um formato de token compacto e autossuficiente que contém informações sobre o usuário (claims) na forma de um objeto JSON. O token é assinado usando uma chave secreta ou criptografia assimétrica, garantindo sua integridade. A estrutura do JWT consiste em três partes, separadas por pontos:
- Header — cabeçalho contendo o tipo do token e o algoritmo de assinatura.
- Payload — carga útil com os dados (ex.: userId, role, exp).
- Signature — assinatura criada com base no header e no payload.
Exemplo de JWT: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.ZL1mK9WpXoQ
Configuração do Projeto Kotlin com Spring Security
Adicionando Dependências
Para começar, vamos criar um novo projeto Spring Boot em Kotlin. No arquivo build.gradle.kts, adicione as seguintes dependências:
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-data-jpa") 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.h2database:h2")}Estamos usando a biblioteca jjwt para trabalhar com JWT e H2 como banco de dados para testes.
Configuração de Segurança
Vamos criar a classe SecurityConfig, que configurará o Spring Security e desabilitará o formulário de login padrão:
@Configuration@EnableWebSecurityclass SecurityConfig(private val jwtAuthFilter: JwtAuthFilter) {
@Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http .csrf { it.disable() } .authorizeHttpRequests { auth -> auth.requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter::class.java) return http.build() }}Permitimos acesso aos endpoints /api/auth/** sem autenticação, enquanto todas as outras requisições exigem um token JWT.
Implementação de OAuth 2.0 e JWT em Kotlin
Geração e Validação de Token JWT
Vamos criar o serviço JwtService, que será responsável por criar e