JWT-Tokens in Kotlin: Vollständiger Leitfaden mit der Bibliothek jjwt
\n\nIn 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.
Was ist JWT?
\nJWT 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
Einbinden der Bibliothek
\nFür die Arbeit mit JWT in Kotlin verwenden wir jjwt (io.jsonwebtoken). Fügen Sie die Abhängigkeit in build.gradle.kts hinzu:
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\nGenerierung eines JWT-Tokens
\nZum Erstellen eines Tokens müssen Sie einen geheimen Schlüssel festlegen, Claims setzen und den Token signieren. Beispiel in Kotlin:
\nimport 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
\nBeim Erhalt eines Tokens vom Client müssen Sie dessen Signatur und Gültigkeitsdauer überprüfen. Verwenden Sie Jwts.parser():
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\nArbeiten mit benutzerdefinierten Claims
\nSie können beliebige Daten in die Nutzlast einfügen. Zum Beispiel die E-Mail oder die Rolle des Benutzers speichern:
\nfun 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 Auch in der Bibliothek
JWT-Tokens in Kotlin: Vollständiger Leitfaden mit Codebeispielen