Dans le chapitre précédent, nous avons créé l’API Spring qui répondra avec les informations de profil utilisateur. Dans la même lancée, nous allons créer un mécanisme de connexion qui émet un JWT lorsque l’utilisateur présente les informations d’identification correctes.
Notre première étape consistera à configurer Spring Security pour permettre l’accès à notre endpoint. Cela peut être fait comme ceci:
Nous désactivons l’authentification et la vérification de jeton CSRF pour l’endpoint /login.
Ensuite, nous construisons un LoginController pour émettre des tokens sur un utilisateur présentant des informations d’identification valides:
Nous utilisons le service de connexion pour vérifier les informations d’identification et il renvoie un Optional<Profilminimal> . S’il existe un profil minimal valide, nous demandons à JwtService d’émettre un jeton.
Le LoginService utilise le ProfileService pour charger un profil correspondant au nom d’utilisateur et au mot de passe présentés par l’utilisateur.
Noter que dans les applications réelles, vous ne devez jamais faire cela. Vous devriez comparer la version hachée du mot de passe présenté par l’utilisateur avec la celle hachée du mot de passe stocké dans votre base de données.
JwtService crée un jeton en utilisant les informations de profil et une date d’expiration de 2 heures avec l’algorithme HMASHA256. Il utilise la clé fournie par SecretKeyProvider. Pour créer le jeton JWT, nous utilisons l’excellente bibliothèque jjwt que nous avons présentée dans le premier chapitre.
Dans cet exemple, SecretKeyProvider charge simplement la clé secrète d’un fichier, où elle est stockée en texte brut. Dans une application réelle, vous pouvez stocker et crypter la version de celle-ci et la décrypter le cas échéant.
Avec ce code, un client peut s’authentifier et recevoir un JWT. Lorsque la demande est faite avec le nom d’utilisateur et le mot de passe corrects:
Nous pouvons voir que dans le header, le Token a la valeur eyJhbGciOiJIUzUxMiJ9. eyJzdWIiOiJqd3QtZGVtbyIsImV4cCI6MTQ2Nzc2Njk3MSwiaXNzIjoiaW4uc2RxYWxpLmp3dCJ9. eu_OuBIkc4BfcTsTu4t_6TCwyLkH4HcuQzvWIMzNQYdxXiWA77SfvwCe4mdc7C17mXdtBAsvFGDj 7A9fzI0M1w.
Si nous devions présenter des informations d’identification non valides, l’API retournera un 401:
Dans le prochain chapitre, nous allons passer à la vérification du jeton présenté par le client pour les demandes ultérieures.