Introduction à OAuth 2.0 et JWT en Kotlin
Les applications web modernes et les services mobiles nécessitent un système d'authentification et d'autorisation fiable et sécurisé. Les deux normes les plus populaires dans ce domaine sont OAuth 2.0 et JWT (JSON Web Token). Dans cet article, nous allons détailler comment implémenter l'autorisation OAuth 2.0 et JWT en langage Kotlin en utilisant le framework Spring Boot. Vous apprendrez à configurer un serveur d'autorisation, à générer et vérifier des tokens, ainsi qu'à sécuriser vos points de terminaison API.
Fondamentaux de OAuth 2.0 et JWT
Qu'est-ce que OAuth 2.0 ?
OAuth 2.0 est un protocole d'autorisation qui permet aux applications tierces d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre ses identifiants (nom d'utilisateur et mot de passe). À la place, un token d'accès est utilisé, délivré après une authentification réussie. Les principaux acteurs de OAuth 2.0 sont :
- Resource Owner (propriétaire de la ressource) — l'utilisateur.
- Client (client) — l'application demandant l'accès.
- Authorization Server — le serveur délivrant les tokens.
- Resource Server — le serveur fournissant les données protégées.
Qu'est-ce que JWT ?
JWT (JSON Web Token) est un format de token compact et autonome qui contient des informations sur l'utilisateur (claims) sous la forme d'un objet JSON. Le token est signé à l'aide d'une clé secrète ou d'un chiffrement asymétrique, ce qui garantit son intégrité. La structure de JWT se compose de trois parties séparées par des points :
- Header — l'en-tête contenant le type de token et l'algorithme de signature.
- Payload — la charge utile avec les données (par exemple, userId, role, exp).
- Signature — la signature créée à partir du header et du payload.
Exemple de JWT : eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.ZL1mK9WpXoQ
Configuration du projet Kotlin avec Spring Security
Ajout des dépendances
Pour commencer, créons un nouveau projet Spring Boot en Kotlin. Dans le fichier build.gradle.kts, ajoutez les dépendances suivantes :
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") implementation("com.h2database:h2")}Nous utilisons la bibliothèque jjwt pour travailler avec JWT et H2 comme base de données pour les tests.
Configuration de Security
Créons une classe SecurityConfig qui configurera Spring Security et désactivera le formulaire de connexion standard :
@Configuration@EnableWebSecurityclass SecurityConfig(private val jwtAuthFilter: JwtAuthFilter) {
@Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { http .csrf { it.disable() } .authorizeHttpRequests { auth -> auth.requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() } .sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) } .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter::class.java) return http.build() }}Nous autorisons l'accès aux points de terminaison /api/auth/** sans authentification, tandis que toutes les autres requêtes nécessitent un token JWT.
Implémentation de OAuth 2.0 et JWT en Kotlin
Génération et vérification du token JWT
Créons un service JwtService qui sera responsable de la création et de la