Dans les parties 1 à 3 de la formation, nous avons créé une API Spring qui peut générer un JWT lorsqu’un utilisateur réussit à s’authentifier. Ici, nous ajouterons la possibilité de vérifier le JWT présenté par le client pour les demandes ultérieures.
Nous allons commencer par configurer Spring security avec un filtre pour capturer le JWT passé par le client dans l’en-tête Authorization ensuite faire en sorte qu’il soit pris en compte avant le UsernamePasswordAuthenticationFilter fourni par Spring security.
Le filtre capture l’en-tête Authorization, crée un JwtAuthToken et le définit comme l’authentification en cours pour la requête.
Le JwtAuthToken est simplement un conduit pour porter le jeton et bien qu’il implémente l’interface d’authentification, il ne fait pas grand-chose.
À ce stade, nous devons indiquer à Spring Security comment valider les jetons. Cela peut être fait en fournissant un AuthenticationProvider personnalisé. Et ceci via la surcharge de la méthode configure.
Le JwtAuthenticationProvider reçoit l’instance d’authentification mise en place dans le SecurityContext, qui dans notre cas est le JwtAuthToken que nous avons défini à l’aide de JwtAuthFilter. Ce jeton est ensuite vérifié en utilisant JwtService. Si le jeton est valide, nous retournons un JwtAuthenticatedProfile. Dans le cas contraire, on lance un exception.
JwtAuthenticatedProfile est une autre implémentation de l’authentification qui enveloppe les informations de profil de l’utilisateur:
Ensuite, nous implémentons la fonctionnalité de validation dans JwtService.
Lorsque nous avons généré le JWT, nous avions défini le username comme le sujet du token.
La dernière chose à faire est de s’assurer que nous gérons correctement les exceptions qui se produisent lors de la validation des jetons. Puisque la validation se produit en dehors des contrôleurs, nous ne pourrons pas utiliser ControllerAdvice pour gérer les exceptions. C’est ici qu’intervient l’AuthenticationEntryPoint de Spring Security. Nous allons configurer un AuthenticationEntryPoint personnalisé comme ceci:
Notre entry point, définit le statut à 403 et définit le corps de la réponse sur un JSON affichant l’erreur.
Avec cette configuration en place, nous pouvons demander un jeton et faire une demande ultérieure avec le JWT reçu.
Si nous devions faire une demande avec un token JWT invalide, nous recevrions une erreur:
Dans le prochain et dernier chapitre, nous allons passer à la conception du front-end avec Angular JS et la gestion de l’authentification côté client.