Aller au contenu

JWT (voir cours complet)

C’est quoi ?

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).

ça sert à quoi ?

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 :

comment l’utiliser ?

Pour utiliser des tokens JWT dans une application ou une API, vous pouvez suivre ces étapes :

  1. Générez un token JWT en spécifiant les informations à transmettre dans le payload et en utilisant une clé secrète pour signer le token.
  2. Envoyez le token JWT à l’autre partie, généralement dans le header “Authorization” d’une requête HTTP.
  3. Lorsque l’autre partie reçoit le token JWT, elle peut vérifier sa signature à l’aide de la clé secrète partagée et accéder aux informations contenues dans le payload.

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.

Avec SpringBoot

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.