Qu'est-ce que OAuth 2.0 et JWT et pourquoi en avez-vous besoin en Kotlin ?
\n\nDans le développement web moderne, la sécurité des données et la gestion des accès sont des tâches clés. Si vous écrivez une application serveur en Kotlin, vous serez tôt ou tard confronté à la nécessité de sécuriser une API ou d'organiser une connexion via des services tiers (Google, GitHub, VK). Pour cela, il existe deux standards — OAuth 2.0 (protocole d'autorisation) et JWT (JSON Web Token — format de jeton).
\n\nDans cet article, nous allons voir comment fonctionnent OAuth 2.0 et JWT, et implémenter une autorisation simple en Kotlin en utilisant des bibliothèques populaires. Le contenu est destiné aux débutants, donc tous les termes complexes seront expliqués en langage simple.
\n\nConcepts de base : OAuth 2.0 et JWT
\n\nQu'est-ce que OAuth 2.0 ?
\nOAuth 2.0 est un protocole qui permet à un service (par exemple, votre application) d'obtenir un accès limité aux ressources d'un utilisateur sur un autre service (par exemple, à son profil Google) sans transmettre son identifiant et mot de passe. Imaginez que vous souhaitiez vous connecter à un site via votre compte Google — c'est cela OAuth 2.0.
\n\nLes principaux acteurs d'OAuth 2.0 :
\n- \n
- Resource Owner — l'utilisateur, propriétaire des données. \n
- Client — votre application qui souhaite obtenir l'accès. \n
- Authorization Server — le serveur qui délivre l'autorisation (par exemple, Google). \n
- Resource Server — le serveur stockant les données de l'utilisateur (par exemple, l'API Google). \n
Qu'est-ce que JWT ?
\nJWT est un format de jeton compact et autonome qui contient des informations sur l'utilisateur (par exemple, ID, rôle, date d'expiration). Le jeton est signé numériquement, il ne peut donc pas être falsifié. JWT se compose de trois parties séparées par des points :
\n\nheader.payload.signature\n\nExemple de JWT décodé :
\n{\n "sub": "1234567890",\n "name": "Иван Петров",\n "iat": 1516239022,\n "exp": 1516242622\n}\n\nLe principal avantage de JWT est que le serveur n'a pas besoin de stocker les sessions dans la base de données. Toutes les informations sont déjà à l'intérieur du jeton.
\n\nImplémentation de l'autorisation JWT en Kotlin avec Spring Boot
\n\nExaminons un exemple pratique. Nous allons créer une API REST en Kotlin en utilisant Spring Boot et Spring Security. Notre application délivrera un jeton JWT lors d'une authentification réussie.
\n\nÉtape 1. Ajout des dépendances
\nAjoutez les dépendances suivantes dans build.gradle.kts :
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Étape 2. Création du service JWT
\nCréons la classe JwtService qui générera et vérifiera les jetons :
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" // minimum 32 caractères\n private val expirationMs = 3600000L // 1 heure\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