Laravel 8

Cours Laravel 8 – la sécurité – l’oubli du mot de passe

Un mot de passe est plus facile à oublier qu’à retenir, d’autant qu’on en est littéralement submergé ! Toute application avec une authentification doit prévoir ce genre de situation et donner la possibilité aux utilisateurs de se sortir de ce mauvais pas. Le plus simple est de leur permettre de créer un nouveau mot de passe. Laravel est équipé pour cela et nous allons le voir dans ce chapitre.

Le présent chapitre est une suite du précédent et il faut avoir mis en place ce qui concerne l’authentification avec l’installation de Jetstream.

La base de données

Avec les migrations réalisées dans le chapitre précédent il y a la table password_resets dans notre base :

On voit qu’on va mémoriser ici l’adresse email, le jeton (token) et le timestamp (par défaut les jetons sont valables pendant une heure). On trouve ces réglages dans le fichier config/auth.php :

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
        'throttle' => 60,
    ],
],

Les routes et les contrôleurs

On a 4 routes pour le renouvellement du mot de passe générées par Fortify :

Tout est géré par ces deux contrôleurs de Fortify :

Première étape : la demande

Pour l’utilisateur la première étape va consister à cliquer sur le lien « Forgot You Password? » prévu sur la vue de connexion :

Ce lien correspond à cette route :

On appelle la méthode create du contrôleur PasswordResetLinkController.

Pour le frontend c’est Jetstream qui est concerné et on a eu création de la vue auth.forgot-password.blade à l’installation du package :

Avec un formulaire qui a cet aspect :

On demande l’adresse email à l’utilisateur. La soumission correspond à cette route :

On appelle la méthode store du contrôleur PasswordResetLinkController.

On peut vérifier que ça fonctionne :

Si la validation passe avec succès on envoie un email à l’utilisateur. Voici le message reçu :

L’envoi de l’email se fait avec un système de notification dont je vous parlerai dans la quatrième partie de ce cours.

Et si tout s’est bien passé on renvoie le formulaire avec un message :

Dans la table  un jeton (token) a été généré :

Il sera ainsi possible de vérifier la provenance de la demande.

Deuxième étape : le renouvellement

Quand on appuie sur le bouton du message ou si on clique sur le lien de secours on utilise cette route :

On appelle la méthode create du contrôleur NewPasswordController de Fortify.

Pour le frontend c’est Jetstream qui est concerné et on a eu création de la vue auth.reset-password.blade à l’installation du package :

Voici l’aspect du formulaire :

Dans ce formulaire on retrouve le jeton (token) dans un contrôle caché :

<input type="hidden" name="token" value="wfeL46gpege1GDk1fe8tlXXxOaF878QN09vOrqBX">

La soumission de ce formulaire utilise cette route :

On appelle la méthode store du contrôleur NewPasswordController.

On commence par une validation :

$request->validate([
    'token' => 'required',
    Fortify::email() => 'required|email',
]);

Ensuite on procède au changement du mot de passe. Enfin si tout va bien on renvoie sur la page de connexion avec un message :

En résumé

  • Un système complet de renouvellement du mot de passe est prévu. avec ses routes, ses contrôleurs et ses vues, en ajoutant le package Jetstream. La partie backend est assurée par le package Fortify.
  • Le renouvellement se fait en deux étapes : une demande qui reçoit une réponse sous forme d’email sécurisé avec un jeton (token) puis une soumission du nouveau mot de passe avec un formulaire.
Print Friendly, PDF & Email

4 commentaires

  • softcode

    Bonjour best momo, merci pour cette partie,
    J’aimerais réaliser un système de renouvellement du mot de passe du genre que lorsque l’utilisateur veut renouveler son mot de passe que le système lui envoie un mail directement dans sont adresse mail (SMTP Gmail) comment réaliser cette configuration dans laravel merci!

      • softcode

        oui best momo, le probleme ce que j’ai un site qui est en production, au lieu d’utiliser mailtrap pour le test d’email, j’aimerai plutôt utilisé SMTP de GMAIL qui permettra à ce que chaque utilisateur voulant renouveller son mot de passe de recevoir un email de confimation directement dans son adresse email, c’est pourquoi je demande comment faire cette configuration dans laravel! merci

        • bestmomo

          Il faut bien renseigner les informations dans le fichier .env :
          MAIL_DRIVER=smtp
          MAIL_HOST=smtp.gmail.com
          MAIL_PORT=465
          MAIL_USERNAME=compte@gmail.com
          MAIL_PASSWORD=motdepasse
          MAIL_ENCRYPTION=ssl

          Personnellement, j’utilise toujours sendmail (plutôt qu’un SMTP comme celui de GMAIL) et je laisse PHP et le serveur se débrouiller, mais ça dépend du serveur que tu utilises.

Laisser un commentaire