Jetons JWT en Kotlin : guide complet avec la bibliothèque jjwt
\n\nDans le développement web moderne, les JWT (JSON Web Tokens) sont devenus un standard pour l'authentification et l'échange d'informations entre le client et le serveur. Dans l'écosystème Kotlin, en particulier lors de la création d'applications backend avec Spring Boot ou Ktor, il est souvent nécessaire de travailler avec les JWT. Dans cet article, nous allons explorer la bibliothèque io.jsonwebtoken (jjwt) — l'outil le plus populaire pour travailler avec les JWT en Java/Kotlin.
Qu'est-ce que JWT ?
\nJWT est un moyen compact et sécurisé pour les URL de représenter des revendications (claims) entre deux parties. Le jeton se compose de trois parties séparées par des points :
\n- \n
- Header — l'en-tête contenant le type de jeton et l'algorithme de signature (par exemple, HS256, RS256). \n
- Payload — la charge utile avec les revendications (claims) :
sub(sujet),iat(date d'émission),exp(date d'expiration) et des données personnalisées. \n - Signature — la signature créée à l'aide d'une clé secrète ou d'une paire de clés. \n
Ajout de la bibliothèque
\nPour travailler avec les JWT en Kotlin, nous utiliserons jjwt (io.jsonwebtoken). Ajoutez la dépendance dans build.gradle.kts :
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") // pour l'analyse JSON\n}\n\nGénération d'un jeton JWT
\nPour créer un jeton, vous devez définir une clé secrète, définir les revendications et signer le jeton. Exemple en 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 heure\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\nVérification et analyse d'un JWT
\nLors de la réception d'un jeton du client, il est nécessaire de vérifier sa signature et sa date d'expiration. Utilisez 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\nTravailler avec des claims personnalisés
\nVous pouvez ajouter toutes les données arbitraires dans le payload. Par exemple, stocker l'email ou le rôle de l'utilisateur :
\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 Aussi dans la bibliothèque
Travailler avec les archives ZIP en Go : guide complet du package archive/zip
Migrations de bases de données en Rust : aperçu des outils Diesel, SeaORM et sqlx
Validation des données en Kotlin : bibliothèques et approches (Kotlin, Java)
Alamofire pour Swift : guide complet avec exemples
gRPC C++ : guide complet avec exemples concrets