Introdução ao OAuth 2.0 e JWT em Kotlin
\n\nAplicações web modernas e APIs exigem mecanismos robustos de autenticação e autorização. Dois padrões principais — OAuth 2.0 (protocolo de delegação de acesso) e JWT (JSON Web Token, formato compacto de token) — são frequentemente usados juntos para construir sistemas seguros. Kotlin, graças à sua compatibilidade com Java e sintaxe concisa, é excelente para implementar esses protocolos.
\n\nNeste artigo, vamos explorar como implementar na prática a autorização OAuth 2.0 e JWT em Kotlin. Você aprenderá a configurar um servidor de emissão de tokens, criar endpoints protegidos e lidar com diferentes tipos de concessão (grant types), como Authorization Code e Client Credentials.
\n\nFundamentos: OAuth 2.0 e JWT
\n\nO que é OAuth 2.0?
\nOAuth 2.0 é um protocolo que permite que aplicativos de terceiros obtenham acesso limitado aos recursos do usuário sem compartilhar login e senha. Os principais participantes são:
\n- \n
- Resource Owner (proprietário do recurso) — geralmente o usuário. \n
- Client (cliente) — o aplicativo que solicita acesso. \n
- Authorization Server (servidor de autorização) — emite os tokens. \n
- Resource Server (servidor de recursos) — armazena os dados protegidos. \n
O que é JWT?
\nJWT é um token compacto e seguro para URL, composto por três partes (header, payload, signature) separadas por pontos. Ele é usado para transmitir declarações (claims) entre as partes. Vantagens do JWT:
\n- \n
- Não requer armazenamento de sessão no servidor (stateless). \n
- Contém todas as informações necessárias (ex.: ID do usuário, papéis). \n
- É assinado digitalmente, garantindo sua integridade. \n
Implementação de OAuth 2.0 com JWT em Kotlin (Spring Boot)
\n\nVamos considerar um exemplo prático usando Spring Boot e a biblioteca Spring Security. Criaremos um servidor de autorização simples e um recurso protegido.
\n\nPasso 1: Configuração das dependências
\nAdicione as dependências necessárias ao build.gradle.kts:
dependencies {\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("org.springframework.boot:spring-boot-starter-security")\n implementation("org.springframework.security:spring-security-oauth2-authorization-server")\n implementation("io.jsonwebtoken:jjwt-api:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")\n runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")\n}\n\nPasso 2: Configuração do servidor de autorização
\nCrie uma classe de configuração para OAuth 2.0:
\nimport org.springframework.context.annotation.Bean\nimport org.springframework.context.annotation.Configuration\nimport org.springframework.security.config.annotation.web.builders.HttpSecurity\nimport org.springframework.security.config.annotation.web.configuration.EnableWebSecurity\nimport org.springframework.security.core.userdetails.User\nimport org.springframework.security.core.userdetails.UserDetailsService\nimport org.springframework.security.oauth2.core.AuthorizationGrantType\nimport org.springframework.security.oauth2.core.ClientAuthenticationMethod\nimport org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClient\nimport org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository\nimport org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration\nimport org.springframework.security.provisioning.InMemoryUserDetailsManager\nimport org.springframework.security.web.SecurityFilterChain\nimport java.util.UUID\n\n@Configuration\n@EnableWebSecurity\nclass SecurityConfig {\n\n @Bean\n