Was sind OAuth 2.0 und JWT und warum werden sie in Kotlin benötigt?
\n\nIn 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\nIn 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\nGrundlegende Konzepte: OAuth 2.0 und JWT
\n\nWas ist OAuth 2.0?
\nOAuth 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\nDie 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
Was ist JWT?
\nJWT 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\nheader.payload.signature\n\nBeispiel eines dekodierten JWT:
\n{\n "sub": "1234567890",\n "name": "Ivan Petrov",\n "iat": 1516239022,\n "exp": 1516242622\n}\n\nDer Hauptvorteil von JWT ist, dass der Server keine Sitzungen in der Datenbank speichern muss. Alle Informationen sind bereits im Token enthalten.
\n\nImplementierung der JWT-Autorisierung in Kotlin mit Spring Boot
\n\nBetrachten 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\nSchritt 1. Abhängigkeiten hinzufügen
\nFügen Sie die folgenden Abhängigkeiten zu Ihrer build.gradle.kts hinzu:
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\nSchritt 2. JWT-Service erstellen
\nErstellen wir eine Klasse JwtService, die Token generiert und überprüft:
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