OAuth-Client für Kotlin: Integration mit Anbietern über ktor-client und kotlinx-serialization
\n\nOAuth 2.0 ist ein standardisiertes Autorisierungsprotokoll, das es Anwendungen ermöglicht, eingeschränkten Zugriff auf Benutzerressourcen zu erhalten, ohne deren Anmeldedaten weiterzugeben. Im Kotlin-Ökosystem kann dank der Kompatibilität mit der JVM und der Multiplattform-Fähigkeit ein OAuth-Client effizient mit modernen Bibliotheken implementiert werden. In diesem Artikel betrachten wir die Erstellung eines OAuth-Clients in Kotlin unter Verwendung von ktor-client für HTTP-Anfragen und kotlinx-serialization für die JSON-Verarbeitung.
Hauptkomponenten des OAuth-Clients
\n- \n
- HTTP-Client —
ktor-clientzum Senden von Anfragen an Autorisierungs- und Ressourcenserver. \n - Serialisierung —
kotlinx-serializationzum Parsen von Antworten in data-Klassen. \n - Token-Speicher — In-Memory oder dauerhaft (SharedPreferences, Dateien). \n
- Zustandsverwaltung — Verarbeitung von Authorization Code, Refresh Token, CSRF-Schutz. \n
Abhängigkeiten einbinden
\nFügen Sie für die Arbeit mit OAuth in Kotlin die folgenden Abhängigkeiten in Ihre build.gradle.kts (oder build.gradle) ein:
// 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\nBasisarchitektur des OAuth-Clients
\nUnterteilen wir die Logik in drei Schichten:
\n- \n
- Modelle (DTO) — data-Klassen für Anfragen/Antworten. \n
- Service — Klasse, die die Autorisierungsabläufe verwaltet. \n
- Client — Wrapper um ktor-client mit Methoden für verschiedene Grant-Typen. \n
Datenmodelle
\nimport 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 // für OpenID Connect\n)\n\n@Serializable\ndata class OAuthError(\n val error: String,\n @SerialName("error_description") val errorDescription: String? = null\n)\n\nOAuth2-Client
\nimport 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 // Generiert die URL für die Weiterleitung zur Autorisierungsseite\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")} Auch in der Bibliothek
validator — Datenvalidierung in Rust
Arbeiten mit Daten in Java: Überblick über die Bibliotheken java.time, Joda-Time und Apache Commons
Twilio für JavaScript (Node.js): Komplettguide mit Beispielen
Überwachung von PHP-Anwendungen mit der Bibliothek php-ast und xhprof