Introduction à OAuth 2.0 et JWT en Java
\n\nLes applications web et API modernes ne se passent que rarement de mécanismes d'authentification et d'autorisation. Les deux standards les plus populaires dans ce domaine sont OAuth 2.0 et JWT (JSON Web Token). Si vous êtes un développeur Java débutant, comprendre ces technologies vous ouvrira la voie à la création de systèmes sécurisés et évolutifs.
\n\nOAuth 2.0 est un protocole d'autorisation qui permet aux applications d'obtenir un accès limité aux ressources d'un utilisateur sans transmettre ses identifiants. JWT, quant à lui, est un format de jeton compact utilisé pour transmettre des affirmations (claims) entre les parties. Dans cet article, nous verrons comment combiner ces technologies dans une application Java en utilisant Spring Security et des bibliothèques populaires.
\n\nFondamentaux d'OAuth 2.0 : comment cela fonctionne
\n\nOAuth 2.0 définit plusieurs rôles de participants à l'interaction :
\n\n- \n
- Resource Owner — l'utilisateur propriétaire des données protégées \n
- Client — l'application qui demande l'accès \n
- Authorization Server — le serveur qui délivre les jetons après authentification \n
- Resource Server — le serveur qui stocke les ressources protégées \n
L'idée principale du protocole est que le client reçoit un jeton d'accès temporaire qu'il présente au serveur de ressources. Le scénario le plus courant est le Authorization Code Flow, utilisé dans les applications web.
\n\nExemple de configuration d'un client OAuth 2.0 dans Spring Boot
\n\nAjoutez la dépendance dans pom.xml :
<dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-oauth2-client</artifactId>\n</dependency>\n\nConfigurez application.yml pour fonctionner avec Google OAuth 2.0 :
spring:\n security:\n oauth2:\n client:\n registration:\n google:\n client-id: YOUR_CLIENT_ID\n client-secret: YOUR_CLIENT_SECRET\n scope:\n - email\n - profile\n\nDésormais, Spring Security gérera automatiquement la redirection vers la page de connexion Google et retournera un jeton d'accès.
\n\nJWT : structure et création du jeton
\n\nUn JWT se compose de trois parties séparées par des points :
\n\n- \n
- Header — contient le type de jeton et l'algorithme de signature (par exemple, HS256) \n
- Payload — contient les affirmations (claims) : données utilisateur, date d'expiration, rôle \n
- Signature — signature créée à partir de l'en-tête et de la charge utile à l'aide d'une clé secrète \n
Pour travailler avec JWT en Java, on utilise le plus souvent la bibliothèque jjwt. Ajoutez la dépendance :
\n\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-api</artifactId>\n <version>0.12.5</version>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-impl</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n<dependency>\n <groupId>io.jsonwebtoken</groupId>\n <artifactId>jjwt-jackson</artifactId>\n <version>0.12.5</version>\n <scope>runtime</scope>\n</dependency>\n\nCréation d'un jeton JWT en Java
\n\nVoici un exemple de classe pour la génération et la validation de JWT :
\n\nimport io.jsonwebtoken.*;\nimport io.jsonwebtoken.security.Keys;\nimport javax.crypto.SecretKey;\nimport java.util.Date;\n\npublic class JwtUtil {\n\n private final SecretKey secretKey = Keys.hmacShaKeyFor(\n "my-secret-key-which-should-be-at-least-256-bits-long".getBytes()\n );\n\n public St