Cliente OAuth para Kotlin: integração com provedores via ktor-client e kotlinx-serialization

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cliente OAuth para Kotlin: integração com provedores via ktor-client e kotlinx-serialization

\n\n

OAuth 2.0 é um protocolo padrão de autorização que permite que aplicativos obtenham acesso limitado aos recursos do usuário sem transmitir suas credenciais. No ecossistema Kotlin, graças à compatibilidade com JVM e à multiplataforma, é possível implementar eficientemente um cliente OAuth usando bibliotecas modernas. Neste artigo, veremos a criação de um cliente OAuth em Kotlin utilizando ktor-client para requisições HTTP e kotlinx-serialization para processamento de JSON.

\n\n

Componentes principais do cliente OAuth

\n
    \n
  • Cliente HTTP — ktor-client para enviar requisições aos servidores de autorização e recursos.
  • \n
  • Serialização — kotlinx-serialization para analisar respostas em data classes.
  • \n
  • Armazenamento de tokens — in-memory ou persistente (SharedPreferences, arquivos).
  • \n
  • Gerenciador de estados — processamento de authorization code, refresh token, proteção CSRF.
  • \n
\n\n

Adicionando dependências

\n

Para trabalhar com OAuth em Kotlin, adicione as seguintes dependências ao build.gradle.kts (ou build.gradle):

\n
// build.gradle.kts\ndependencies {\n    implementation("io.ktor:ktor-client-core:2.3.12")\n    implementation("io.ktor:ktor-client-cio:2.3.12") // engine\n    implementation("io.ktor:ktor-client-content-negotiation:2.3.12")\n    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.12")\n    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")\n    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")\n}
\n\n

Arquitetura básica do cliente OAuth

\n

Vamos dividir a lógica em três camadas:

\n
    \n
  • Modelos (DTO) — data classes para requisições/respostas.
  • \n
  • Serviço — classe que gerencia os fluxos de autorização.
  • \n
  • Cliente — wrapper sobre o ktor-client com métodos para diferentes grants.
  • \n
\n\n

Modelos de dados

\n
import kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class TokenResponse(\n    @SerialName("access_token") val accessToken: String,\n    @SerialName("token_type") val tokenType: String = "Bearer",\n    @SerialName("expires_in") val expiresIn: Long? = null,\n    @SerialName("refresh_token") val refreshToken: String? = null,\n    @SerialName("scope") val scope: String? = null,\n    @SerialName("id_token") val idToken: String? = null // para OpenID Connect\n)\n\n@Serializable\ndata class OAuthError(\n    val error: String,\n    @SerialName("error_description") val errorDescription: String? = null\n)
\n\n

Cliente OAuth2

\n
import io.ktor.client.*\nimport io.ktor.client.call.*\nimport io.ktor.client.plugins.contentnegotiation.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.*\nimport io.ktor.serialization.kotlinx.json.*\nimport kotlinx.serialization.json.Json\n\nclass OAuth2Client(\n    private val clientId: String,\n    private val clientSecret: String,\n    private val redirectUri: String,\n    private val tokenEndpoint: String,\n    private val authEndpoint: String\n) {\n    private val httpClient = HttpClient(CIO) {\n        install(ContentNegotiation) {\n            json(Json {\n                ignoreUnknownKeys = true\n                isLenient = true\n            })\n        }\n    }\n\n    // Geração da URL para redirecionamento à página de autorização\n    fun getAuthorizationUrl(state: String, scope: String = "openid profile email"): String {\n        return "$authEndpoint?response_type=code" +\n                "&client_id=$clientId" +\n                "&redirect_uri=${java.net.URLEncoder.encode(redirectUri, "UTF-8")}" +\n                "&scope=${java.net.URLEncoder.encode(scope, "UTF-8")}                    

Recommendations