Cliente OAuth para Kotlin: biblioteca Ktor OAuth
A biblioteca Ktor OAuth é uma extensão oficial para o cliente HTTP Ktor, projetada para implementar o protocolo OAuth 2.0 em aplicações Kotlin. Ela fornece uma maneira flexível e type-safe de integrar com provedores OAuth populares (Google, GitHub, Facebook, VK e outros), além de suportar endpoints personalizados. A biblioteca faz parte do ecossistema Ktor e pode ser usada tanto em aplicações Kotlin do lado do servidor quanto do lado do cliente.
O principal caso de uso é obter tokens de acesso para trabalhar com REST APIs protegidas. A biblioteca automatiza o processo de troca do código de autorização por tokens, renovação de tokens (refresh token) e gerenciamento do estado da sessão.
Principais recursos
- Suporte aos fluxos OAuth 2.0: Authorization Code Grant, Implicit Grant, Client Credentials, Resource Owner Password Credentials.
- Suporte integrado para provedores populares: Google, GitHub, Facebook, Twitter, VK, Yandex, Microsoft e outros.
- Provedores personalizados: possibilidade de definir endpoints de autorização, token e redirecionamento manualmente.
- Renovação automática de tokens: suporte a refresh token com chamada automática quando o access token expira.
- Trabalho com sessões: armazenamento de tokens em memória, arquivos, bancos de dados ou armazenamentos personalizados.
- Integração com Ktor Client: configuração unificada através de plugins, suporte a todos os transportes (CIO, Apache, OkHttp).
- Segurança: suporte a PKCE (Proof Key for Code Exchange) para proteção contra ataques CSRF.
Instalação
Para adicionar a biblioteca, inclua a dependência no build.gradle.kts:
dependencies { // Cliente Ktor principal implementation("io.ktor:ktor-client-core:2.3.7") // Plugin OAuth implementation("io.ktor:ktor-client-auth:2.3.7") // Engine específico (por exemplo, CIO) implementation("io.ktor:ktor-client-cio:2.3.7")}Para Maven:
<dependency> <groupId>io.ktor</groupId> <artifactId>ktor-client-auth</artifactId> <version>2.3.7</version></dependency>Exemplo: autorização via Google OAuth
Crie um cliente HTTP com o plugin OAuth configurado para o Google:
import io.ktor.client.*import io.ktor.client.plugins.auth.*import io.ktor.client.plugins.auth.providers.*import io.ktor.client.request.*import io.ktor.client.statement.*
suspend fun main() { val client = HttpClient { install(Auth) { oauth { clientId = System.getenv("GOOGLE_CLIENT_ID") clientSecret = System.getenv("GOOGLE_CLIENT_SECRET") providerLookup = { OAuthServerSettings.OAuthAuthorizationCodeServerSettings( authorizeUrl = "https://accounts.google.com/o/oauth2/auth", tokenUrl = "https://oauth2.googleapis.com/token", clientId = clientId, clientSecret = clientSecret, redirectUrl = "http://localhost:8080/callback" ) } urlProvider = { request -> // Geração da URL para redirecionamento do usuário "http://localhost:8080/login" } } } }
// Exemplo de requisição para a Google Sheets API val response: HttpResponse = client.get("https://sheets.googleapis.com/v4/spreadsheets/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/values/Sheet1!A1:D5") println(response.bodyAsText())}Exemplo: provedor personalizado com PKCE
Para aumentar a segurança, use PKCE (P