OAuth 2.0 et autorisation JWT en Kotlin : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Qu'est-ce que OAuth 2.0 et JWT et pourquoi en avez-vous besoin en Kotlin ?

\n\n

Dans 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\n

Dans 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\n

Concepts de base : OAuth 2.0 et JWT

\n\n

Qu'est-ce que OAuth 2.0 ?

\n

OAuth 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\n

Les 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
\n\n

Qu'est-ce que JWT ?

\n

JWT 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\n
header.payload.signature
\n\n

Exemple de JWT décodé :

\n
{\n  "sub": "1234567890",\n  "name": "Иван Петров",\n  "iat": 1516239022,\n  "exp": 1516242622\n}
\n\n

Le 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\n

Implémentation de l'autorisation JWT en Kotlin avec Spring Boot

\n\n

Examinons 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

\n

Ajoutez les dépendances suivantes dans build.gradle.kts :

\n\n
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

\n

Créons la classe JwtService qui générera et vérifiera les jetons :

\n\n
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                

Blogs

Book Recommendations