JWT-Tokens in Kotlin: Generierung, Überprüfung und Verwendung mit io.jsonwebtoken

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

JWT-Tokens in Kotlin: Vollständiger Leitfaden mit der Bibliothek jjwt

\n\n

In der modernen Webentwicklung sind JWT (JSON Web Tokens) zum Standard für Authentifizierung und Informationsaustausch zwischen Client und Server geworden. Im Kotlin-Ökosystem, insbesondere bei der Erstellung von Backend-Anwendungen mit Spring Boot oder Ktor, besteht häufig die Notwendigkeit, mit JWT zu arbeiten. In diesem Artikel behandeln wir die Bibliothek io.jsonwebtoken (jjwt) – das beliebteste Tool für die Arbeit mit JWT in Java/Kotlin.

\n\n

Was ist JWT?

\n

JWT ist eine kompakte, URL-sichere Möglichkeit, Ansprüche (Claims) zwischen zwei Parteien darzustellen. Der Token besteht aus drei durch Punkte getrennten Teilen:

\n
    \n
  • Header – der Header, der den Tokentyp und den Signaturalgorithmus enthält (z. B. HS256, RS256).
  • \n
  • Payload – die Nutzlast mit den Claims: sub (Betreff), iat (Ausstellungszeit), exp (Ablaufzeit) und benutzerdefinierte Daten.
  • \n
  • Signature – die Signatur, die mit einem geheimen Schlüssel oder einem Schlüsselpaar erstellt wird.
  • \n
\n\n

Einbinden der Bibliothek

\n

Für die Arbeit mit JWT in Kotlin verwenden wir jjwt (io.jsonwebtoken). Fügen Sie die Abhängigkeit in build.gradle.kts hinzu:

\n
dependencies {\n    implementation("io.jsonwebtoken:jjwt-api:0.12.6")\n    runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.6")\n    runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.6") // für JSON-Parsing\n}
\n\n

Generierung eines JWT-Tokens

\n

Zum Erstellen eines Tokens müssen Sie einen geheimen Schlüssel festlegen, Claims setzen und den Token signieren. Beispiel in Kotlin:

\n
import io.jsonwebtoken.Jwts\nimport io.jsonwebtoken.security.Keys\nimport java.util.Date\nimport javax.crypto.SecretKey\n\nfun generateToken(userId: String, secret: String): String {\n    val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())\n    \n    val now = Date()\n    val expiration = Date(now.time + 3600_000) // +1 Stunde\n    \n    return Jwts.builder()\n        .subject(userId)\n        .issuedAt(now)\n        .expiration(expiration)\n        .claim("role", "USER")\n        .signWith(key)\n        .compact()\n}
\n\n

Überprüfung und Parsing von JWT

\n

Beim Erhalt eines Tokens vom Client müssen Sie dessen Signatur und Gültigkeitsdauer überprüfen. Verwenden Sie Jwts.parser():

\n
import io.jsonwebtoken.JwtException\nimport io.jsonwebtoken.Jwts\nimport io.jsonwebtoken.security.Keys\nimport javax.crypto.SecretKey\n\nfun validateToken(token: String, secret: String): Boolean {\n    return try {\n        val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())\n        Jwts.parser()\n            .verifyWith(key)\n            .build()\n            .parseSignedClaims(token)\n        true\n    } catch (e: JwtException) {\n        false\n    }\n}\n\nfun extractUserId(token: String, secret: String): String? {\n    return try {\n        val key: SecretKey = Keys.hmacShaKeyFor(secret.toByteArray())\n        val claims = Jwts.parser()\n            .verifyWith(key)\n            .build()\n            .parseSignedClaims(token)\n            .payload\n        claims.subject\n    } catch (e: Exception) {\n        null\n    }\n}
\n\n

Arbeiten mit benutzerdefinierten Claims

\n

Sie können beliebige Daten in die Nutzlast einfügen. Zum Beispiel die E-Mail oder die Rolle des Benutzers speichern:

\n
fun generateTokenWithCustomClaims(userId: String, email: String, secret: String): String {\n    val key = Keys.hmacShaKeyFor(secret.toByteArray())\n    \n    return Jwts.builder()\n        .subject(userId)\n        .claim("email", email)\n        .claim("isAdmin", false)\n        .issuedAt(Date())\n        .expiration(Date(System.currentTimeMillis() + 3600_000))\n        .signWith(key)\n        .compact()\n}\n\nfun extractCustomClaim(token: String, secret: String): String? {\n    val key = Keys.hmacShaKeyFor(secret.toByteArray())\n                    

Empfehlungen