OAuth 2.0 und JWT-Autorisierung in Kotlin: Vollständiger Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was sind OAuth 2.0 und JWT und warum werden sie in Kotlin benötigt?

\n\n

In der modernen Webentwicklung gehören Datensicherheit und Zugriffsverwaltung zu den zentralen Aufgaben. Wenn Sie eine Serveranwendung in Kotlin schreiben, werden Sie früher oder später auf die Notwendigkeit stoßen, eine API zu schützen oder die Anmeldung über Drittanbieterdienste (Google, GitHub, VK) zu organisieren. Dafür gibt es zwei Standards – OAuth 2.0 (Autorisierungsprotokoll) und JWT (JSON Web Token – Token-Format).

\n\n

In diesem Artikel werden wir untersuchen, wie OAuth 2.0 und JWT funktionieren, und eine einfache Autorisierung in Kotlin unter Verwendung gängiger Bibliotheken implementieren. Das Material richtet sich an Anfänger, daher werden alle komplexen Begriffe in einfacher Sprache erklärt.

\n\n

Grundlegende Konzepte: OAuth 2.0 und JWT

\n\n

Was ist OAuth 2.0?

\n

OAuth 2.0 ist ein Protokoll, das es einem Dienst (z. B. Ihrer Anwendung) ermöglicht, eingeschränkten Zugriff auf die Ressourcen eines Benutzers auf einem anderen Dienst (z. B. auf sein Google-Profil) zu erhalten, ohne Login und Passwort zu übertragen. Stellen Sie sich vor, Sie möchten sich auf einer Website über Ihr Google-Konto anmelden – das ist OAuth 2.0.

\n\n

Die Hauptakteure von OAuth 2.0:

\n
    \n
  • Resource Owner – der Benutzer, der Eigentümer der Daten.
  • \n
  • Client – Ihre Anwendung, die Zugriff erhalten möchte.
  • \n
  • Authorization Server – der Server, der die Berechtigung erteilt (z. B. Google).
  • \n
  • Resource Server – der Server, der die Benutzerdaten speichert (z. B. die Google API).
  • \n
\n\n

Was ist JWT?

\n

JWT ist ein kompaktes und eigenständiges Token-Format, das Informationen über den Benutzer enthält (z. B. ID, Rolle, Gültigkeitsdauer). Das Token ist digital signiert, sodass es nicht gefälscht werden kann. JWT besteht aus drei Teilen, die durch Punkte getrennt sind:

\n\n
header.payload.signature
\n\n

Beispiel eines dekodierten JWT:

\n
{\n  "sub": "1234567890",\n  "name": "Ivan Petrov",\n  "iat": 1516239022,\n  "exp": 1516242622\n}
\n\n

Der Hauptvorteil von JWT ist, dass der Server keine Sitzungen in der Datenbank speichern muss. Alle Informationen sind bereits im Token enthalten.

\n\n

Implementierung der JWT-Autorisierung in Kotlin mit Spring Boot

\n\n

Betrachten wir ein praktisches Beispiel. Wir werden eine REST-API in Kotlin mit Spring Boot und Spring Security erstellen. Unsere Anwendung wird bei erfolgreicher Authentifizierung ein JWT-Token ausstellen.

\n\n

Schritt 1. Abhängigkeiten hinzufügen

\n

Fügen Sie die folgenden Abhängigkeiten zu Ihrer build.gradle.kts hinzu:

\n\n
dependencies {\n    implementation("org.springframework.boot:spring-boot-starter-security")\n    implementation("org.springframework.boot:spring-boot-starter-web")\n    implementation("io.jsonwebtoken:jjwt-api:0.12.5")\n    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5")\n    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5")\n}
\n\n

Schritt 2. JWT-Service erstellen

\n

Erstellen wir eine Klasse JwtService, die Token generiert und überprüft:

\n\n
import io.jsonwebtoken.Claims\nimport io.jsonwebtoken.Jwts\nimport io.jsonwebtoken.security.Keys\nimport org.springframework.stereotype.Service\nimport java.util.*\n\n@Service\nclass JwtService {\n    private val secretKey = "mySecretKeyForJwtToken12345678901234567890" // mindestens 32 Zeichen\n    private val expirationMs = 3600000L // 1 Stunde\n\n    fun generateToken(username: String): String {\n        val claims: Map = mapOf(\n            "sub" to username,\n            "iat" to Date(),\n            "exp" to Date(System.currentTimeMillis() + expirationMs)\n        )\n        return Jwts.builder()\n            .claims(claims)\n            .signWith(Keys.hmacShaKeyFor(secretKey.toByteArray()))\n            .compact()\n    }\n\n    fun extractUsername(token: String): String? {\n        return try {\n            val claims = parseToken(token)\n            claims.subject\n        } catch (e: Exception) {\n            nul                

Blogs

Buchempfehlungen