Json Web Token est un standard de l’industrie utilisé pour transmettre de manière sécurisée des informations entre différentes parties, généralement dans le cadre d’une application Web ou d’une API (Application Programming Interface).
Un token JWT est une chaîne de caractères encodée en base 64 qui est utilisée pour transmettre de manière sécurisée des informations entre les parties qui sont autorisées à les recevoir. Un token JWT est composé de trois parties séparées par des points, comme dans cet exemple :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Voici comment cela se décompose :
Pour utiliser des tokens JWT dans une application ou une API, vous pouvez suivre ces étapes :
JWT est un standard ouvert et largement utilisé pour transmettre de manière sécurisée des informations entre différentes parties, notamment dans le cadre d’applications Web et d’APIs.
Tout d’abord, vous devez ajouter la dépendance suivante à votre fichier pom.xml (si vous utilisez Maven) ou à votre fichier build.gradle (si vous utilisez Gradle) pour inclure la bibliothèque jjwt dans votre projet :
Maven :
<!-- Maven --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
Gradle :
// Gradle compile 'io.jsonwebtoken:jjwt:0.9.1'
Ensuite, vous pouvez utiliser la bibliothèque jjwt pour générer un token JWT en spécifiant le payload et en signant le token avec une clé secrète. Voici un exemple de code qui montre comment faire cela en utilisant la classe Jwts de jjwt :
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; // Génération du token JWT String jwt = Jwts.builder() .setSubject("utilisateur") // payload .signWith(SignatureAlgorithm.HS256, "maCleSecrete") // signature avec une clé secrète .compact();
Ensuite, vous pouvez ajouter une logique de filtrage dans votre application Spring Boot pour vérifier que les requêtes HTTP envoyées au serveur possèdent un token JWT valide dans le header “Authorization”. Pour ce faire, vous pouvez utiliser la classe OncePerRequestFilter de Spring et la bibliothèque jjwt pour vérifier la signature du token JWT et accéder aux informations contenues dans son payload. Voici un exemple de code qui montre comment faire cela :
import io.jsonwebtoken.Jwts; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class JwtFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // Récupération du header "Authorization" String header = request.getHeader("Authorization"); // Vérification du format du header et de la présence du token JWT if (header == null || !header.startsWith("Bearer ")) { throw new ServletException("Token JWT manquant dans le header 'Authorization'"); } // Vérification de la signature du token JWT et récupération du payload String subject = Jwts.parser() .setSigningKey("maCleSecrete") .parseClaimsJws(header.substring(7)) .getBody() .getSubject(); // Vérification des informations contenues dans le payload et autorisation ou refus de l'accès aux ressources if (subject == null) { throw new ServletException("Utilisateur non valide"); } // Si tout est ok, on laisse passer la requête filterChain.doFilter(request, response);
Si le token JWT est présent et valide, vous pouvez accéder aux informations contenues dans son payload et autoriser ou refuser l’accès à certaines ressources en fonction de ces informations. Voici comment accéder aux informations du payload avec la bibliothèque jjwt :
Enfin, vous pouvez ajouter une logique pour générer et envoyer un nouveau token JWT à chaque fois qu’un utilisateur se connecte ou rafraîchit sa session. Pour ce faire, vous pouvez utiliser la méthode login d’un contrôleur ou d’un service pour générer un nouveau token JWT et l’envoyer au client dans le header de la réponse HTTP. Voici un exemple de code qui montre comment faire cela :
import io.jsonwebtoken.Jwts; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class MonController { @PostMapping("/login") public void login(@RequestBody Utilisateur utilisateur) { // Vérification des informations d'identification de l'utilisateur // ... // Génération et envoi d'un nouveau token JWT String jwt = Jwts.builder() .setSubject(utilisateur.getNom()) // payload .signWith(SignatureAlgorithm.HS256, "maCleSecrete") // signature avec une clé secrète .compact(); response.addHeader("Authorization", "Bearer " + jwt); } }
Voilà, maintenant vous savez comment utiliser les tokens JWT avec Spring Boot pour authentifier et autoriser l’accès à certaines ressources de votre application ou de votre API.