‫Instructeur : Dans cette vidéo et les
‫suivantes, nous allons implémenter une fonctionnalité
‫de réinitialisation de mot de passe conviviale, qui est en quelque
‫sorte la norme dans la plupart des applications Web.
‫Et probablement, vous avez déjà utilisé la réinitialisation du mot
‫de passe sur un site Web et cela
‫fonctionne généralement comme ceci.
‫Il vous suffit de fournir votre adresse
‫e-mail et vous recevrez ensuite un e-mail avec
‫un lien sur lequel vous pourrez cliquer, puis cela vous
‫mènera à une page où vous pourrez saisir un nouveau mot de passe.
‫Il s'agit d'une procédure très standard et c'est donc
‫également ainsi que nous allons l'implémenter
‫ici dans cette application.
‫Fondamentalement, il y a deux étapes.
‫Pour le premier, l'utilisateur envoie une demande de publication
‫à un itinéraire de mot de passe oublié, uniquement avec cette adresse e-mail.
‫Cela créera ensuite un jeton de
‫réinitialisation et l'enverra à l'adresse e-mail qui a été fournie.
‫Juste un jeton aléatoire simple, pas un jeton Web JSON.
‫C'est une différence ici.
‫Ensuite, dans la deuxième partie, qui sera la prochaine
‫vidéo, l'utilisateur envoie ensuite ce jeton depuis son e-mail avec un
‫nouveau mot de passe afin de mettre à jour son mot de passe.
‫Fondamentalement, nous aurons des exportations avec mot de passe oublié, ce qui est
‫la première étape.
‫Donc, demande, réponse et ensuite, puis dans un deuxième temps, nous
‫avons réinitialisé le mot de passe.
‫Ensuite, allons également de l'avant et implémentons ces deux routes.
‫D'accord, et c'est, bien sûr, dans leur fichier de routeur utilisateur
‫ou de routes utilisateur.
‫Mettons-les également ici et en
‫fait, je peux simplement dupliquer ces lignes ici.
‫Nous avons donc à nouveau oublié le mot
‫de passe, qui ne
‫recevra que l'adresse e-mail puis réinitialisera le mot de passe, qui recevra
‫le jeton ainsi que le nouveau mot de passe.
‫C'est celui que
‫nous allons commencer à mettre en œuvre dans cette conférence.
‫Comme avant, précisons nos étapes ici.
‫Donc, d'abord, obtenez l'utilisateur en
‫fonction de l'e-mail publié,
‫puis générez le jeton aléatoire.
‫Et puis renvoyez-le par e-mail.
‫Ce truc est assez commun pour nous à ce stade.
‫Donc utilisateur, attendons donc l'utilisateur dot find et maintenant il s'agit d'en trouver
‫un, pas de trouver par
‫identifiant car nous ne connaissons pas l'identifiant de l'utilisateur.
‫Et l'utilisateur, bien sûr, ne connaît pas non plus son propre
‫identifiant et nous avons donc spécifié l'adresse e-mail.
‫Fondamentalement, c'est la seule donnée connue.
‫Et c'est l'adresse e-mail de point body dot sur demande.
‫Et bien sûr, maintenant, nous
‫devons dire que nous sommes dans une fonction asynchrone, puis comme avant,
‫enveloppons-la dans catch async.
‫Faites une sauvegarde et l'erreur devrait disparaître.
‫Ensuite, étape suivante, vérifions
‫si l'utilisateur existe.
‫Donc s'il n'y a pas d'utilisateur, retournez au middleware suivant avec
‫bien sûr une nouvelle erreur.
‫Il n'y a pas d'utilisateur avec cette adresse e-mail.
‫Et puis on peut mettre un 404, ce qui, comme vous
‫le savez déjà, signifie introuvable.
‫Ensuite, générons le jeton aléatoire et pour cela, une
‫fois de plus, nous
‫allons créer une méthode instantanée sur l'utilisateur.
‫Parce qu'une fois de plus, cela a vraiment à voir
‫avec les données de l'utilisateur elles-mêmes.
‫Et nous allons vraiment écrire un peu de
‫code, et donc, si ce n'était qu'une seule ligne de
‫code, alors bien sûr, nous pourrions simplement la mettre ici.
‫Mais nous avons besoin de quelques lignes
‫de code et encore une fois, c'est un peu
‫plus propre de le séparer dans sa propre fonction.
‫Et cela, généralement avec Mongoose, est préférable en tant que méthode instantanée.
‫Donc ici en bas, modifions juste ici à la fin.
‫Ainsi, les méthodes de point de schéma utilisateur ne créent pas un jeton de réinitialisation de mot de passe.
‫Un nom assez long et descriptif.
‫J'aime faire comme ça,
‫pour savoir exactement à quoi j'ai affaire.
‫Le jeton de réinitialisation de mot de passe doit essentiellement être une chaîne aléatoire, mais
‫en même temps, il n'a pas besoin
‫d'être aussi fort cryptographiquement que le hachage de mot de passe que nous
‫avons créé auparavant.
‫Nous pouvons simplement utiliser la fonction d'octets aléatoires
‫très simple du module crypto intégré.
‫Allons de l'avant et ajoutons cela.
‫Crypto nécessite et encore une fois, il s'agit d'un module de nœud intégré, donc pas
‫besoin d'installer quoi que ce soit.
‫Frais.
‫Maintenant, générons notre jeton.
‫Et pour cela, nous utilisons des octets aléatoires de points cryptographiques,
‫puis nous devons spécifier le nombre de
‫caractères en gros.
‫Et puis à la fin, nous
‫le convertissons également en une chaîne hexadécimale.
‫Deux
‫chaînes, puis nous pouvons spécifier l'option hexadécimale ici.
‫Maintenant, si vous vous
‫demandez pourquoi nous créons réellement ce
‫jeton, je suppose que je ne l'ai pas encore vraiment expliqué.
‫Fondamentalement, ce jeton est ce que nous allons
‫envoyer à l'utilisateur et c'est donc comme un mot de passe de
‫réinitialisation que l'utilisateur peut ensuite utiliser pour créer un nouveau mot de passe réel.
‫Et bien entendu, seul l'utilisateur aura accès à ce token.
‫Et donc en fait, il se comporte vraiment comme un mot de passe.
‫Puisqu'il ne s'agit essentiellement que d'un mot de passe, cela
‫signifie que si un pirate informatique peut accéder à notre base de données,
‫cela permettra au pirate informatique d'accéder au compte
‫en définissant un nouveau mot de passe.
‫Si nous stockions simplement ce jeton de réinitialisation dans
‫notre base de données maintenant, alors si un attaquant accède à la base de
‫données, il pourrait alors utiliser ce jeton et
‫créer un nouveau mot de passe en utilisant ce jeton au
‫lieu de vous le faire.
‫Ils contrôleraient alors efficacement votre compte au lieu
‫que vous le fassiez.
‫Tout comme un mot de passe, nous ne devons
‫jamais stocker un jeton de réinitialisation simple dans la base de données.
‫Chiffrons-le en fait, mais comme
‫auparavant avec le mot de passe, il n'a
‫pas besoin d'une méthode de chiffrement aussi forte du point
‫de vue cryptographique.
‫Parce que ces jetons de réinitialisation sont un vecteur
‫d'attaque beaucoup moins dangereux.
‫Encore une fois, nous allons simplement utiliser le
‫module crypto intégré.
‫Cela fonctionne de cette manière étrange.
‫Nous disons crypto puis créons un hachage
‫avec l'algorithme sha 256, puis nous devons dire
‫mise à jour,
‫puis variable où le jeton est stocké.
‫Quelle que soit la chaîne que nous voulons crypter essentiellement.
‫Et puis nous devons dire digérer, puis le stocker à
‫nouveau sous forme hexadécimale.
‫Et maintenant, où allons-nous réellement enregistrer ce jeton de réinitialisation ?
‫Eh bien, nous allons créer un nouveau champ dans notre schéma de base de données.
‫Parce que bien sûr, nous voulons l'enregistrer dans la base
‫de données, afin de pouvoir ensuite
‫le comparer avec le jeton fourni par l'utilisateur.
‫Faisons-le ici à la fin.
‫Jeton de réinitialisation de mot de
‫passe, c'est la chaîne.
‫Et puis la réinitialisation du mot de passe expire également.
‫Parce que cette
‫réinitialisation expirera après un certain temps par mesure de sécurité.
‫Vous n'aurez que 10 minutes pour réinitialiser réellement votre
‫mot de passe.
‫Allons-y maintenant et utilisons-les.
‫Ce jeton de réinitialisation de mot de passe par points est alors égal
‫à ce cryptage.
‫Ensuite, définissons l'expiration de la réinitialisation du mot de
‫passe et définissons ce point à jour maintenant, puis ajoutons
‫simplement quelques secondes à cela.
‫Nous voulons que cela fonctionne pendant 10
‫minutes et c'est donc 10 minutes et nous en avons besoin en millisecondes.
‫Fois 60 pour les secondes, puis fois 1000 pour les millisecondes.
‫Et puis je veux aussi renvoyer le jeton en texte brut parce
‫que c'est en fait celui que nous allons
‫envoyer par e-mail.
‫Renvoyez le jeton de réinitialisation.
‫Nous devons envoyer par e-mail le jeton
‫de réinitialisation non crypté, car sinon cela n'aurait
‫pas beaucoup de sens de le crypter du tout.
‫Si le jeton qui se trouvait
‫dans la base de données était exactement le même que
‫celui que nous pourrions utiliser pour changer le
‫mot de passe, alors ce ne serait pas du tout un cryptage.
‫Nous avons envoyé un jeton par
‫e-mail, puis nous avons la version cryptée dans notre base de données.
‫Et celui crypté est alors fondamentalement inutile pour
‫changer le mot de passe.
‫C'est comme lorsque nous enregistrons
‫uniquement le mot de passe crypté lui-même dans la
‫base de données, comme nous l'avons fait ici, donc où nous
‫avons crypté le mot de passe à l'aide de bcrypt.
‫Gardez à l'esprit que les seules données sensibles
‫jamais enregistrées sous une forme cryptée, puis comparez-les
‫avec la version cryptée qui se trouve dans la
‫base de données.
‫Il suffit d'enregistrer ces deux-là sur
‫la console, ce qui nous facilitera un peu la vie par la suite.
‫Disons que je réinitialise le jeton et que je me
‫connecte ici
‫en tant qu'objet, car de cette façon, il me dira alors
‫le nom de la variable ainsi que sa valeur.
‫Et puis la même chose avec ce jeton de réinitialisation de mot de passe par points.
‫Celui-ci ne fonctionne pas vraiment
‫avec l'écriture d'objets, cette nouvelle manière ES6
‫et restons-en là.
‫Quoi qu'il en soit,
‫revenons ici et utilisons ensuite cette fonction.
‫Alors rappelez-vous comment nous avons renvoyé le jeton de
‫réinitialisation, et stockons-le ici.
‫Donc, le jeton de réinitialisation est égal au jeu de points utilisateur et je ne
‫suis plus sûr du nom.
‫Créez un jeton de réinitialisation de mot de
‫passe, donc c'est long.
‫D'accord et c'est fait, mais en fait
‫ce que nous avons fait était juste de modifier
‫les données ici.
‫Lorsque nous avons défini ce point mot de passe expire par exemple à
‫cette valeur, nous n'avons en fait pas vraiment
‫mis à jour le document.
‫Nous ne l'avons pas sauvegardé.
‫Nous ne faisons que le
‫modifier, mais maintenant nous devons ensuite le sauvegarder.
‫Disons que wait user dot save.
‫Mais regardez ce qui se passe alors que nous l'utilisons maintenant.
‫Prenons juste celui-ci ici.
‫C'est l'itinéraire que nous avons déjà trouvé.
‫Et maintenant, nous obtenons que cet itinéraire n'est pas encore défini.
‫Voyons pourquoi.
‫Dans la route utilisateur, nous avons clairement la même URL ici, mais je vois
‫que nous devons en fait faire une demande de publication.
‫D'accord, d'accord, mais maintenant nous obtenons une erreur disant de fournir une
‫adresse e-mail et un mot de passe.
‫Et c'est ce que je voulais dire quand j'ai dit
‫regarde ce qui se passe quand tu essaies ça.
‫Cela se produit parce que nous essayons d'enregistrer un document,
‫mais nous ne spécifions pas toutes les données obligatoires, donc les
‫champs que nous avons marqués comme requis.
‫Corrigeons cela rapidement.
‫Tout ce que nous avons à faire est de passer une
‫option spéciale dans cette méthode d'enregistrement de points utilisateur.
‫Nous
‫disons valider avant le
‫saveset sur false.
‫Cela désactivera ensuite tous les valideurs que nous avons
‫spécifiés dans notre schéma.
‫Ce sont ces petites choses que vous devez savoir
‫qui feront toute la différence.
‫Maintenant, je ne savais pas non plus que cela
‫existait parce que personne ne sait vraiment tout.
‫C'est impossible.
‫Une bibliothèque comme Mongoose est tout simplement trop grande pour que
‫vous sachiez tout ce qu'il y a.
‫Je suis allé de l'avant et j'ai lu la documentation
‫de Mongoose et c'est donc là que j'ai trouvé cette option extrêmement utile.
‫Tout ça pour dire encore une fois, personne
‫ne sait tout et c'est
‫donc vraiment une bonne habitude si
‫vous rencontrez des
‫problèmes de jeter un œil à
‫la documentation de la bibliothèque que vous utilisez.
‫Jetons un coup d'œil à cela maintenant.
‫Et nous obtenons toujours la même erreur ici, mais je
‫vois ici que cela vient
‫en fait de la fonction de connexion.
‫Voyons ce qui se passe ici.
‫Jetons également un œil aux itinéraires.
‫Ah, d'accord, alors voici le problème.
‫Nous essayons maintenant d'appeler le gestionnaire
‫de connexion, ce qui, bien sûr, n'a pas de sens.
‫Ici, c'est le mot de passe oublié.
‫Ici, c'est réinitialiser le mot de passe.
‫Et donc l'erreur que nous avons eue avant n'était en fait pas
‫due à la validation.
‫Renvoyons ceci et maintenant nous
‫obtenons l'erreur qu'il n'y a aucun
‫utilisateur avec cette
‫adresse e-mail et c'est parce que nous n'avons spécifié
‫aucune adresse e-mail dans le corps.
‫Nous avons testé
‫cela et il est maintenant temps de le
‫tester avec un e-mail utilisateur.
‫D'accord.
‫Et maintenant, il ne devrait
‫plus rien faire parce que nous ne renvoyons aucune réponse.
‫Annulons simplement cela
‫car tout ce qui m'intéressait
‫vraiment était de voir ces jetons ici, puis
‫de jeter un œil à l'objet utilisateur.
‫C'est ici le jeton de réinitialisation d'origine, vous voyez
‫donc que c'est une chaîne hexadécimale aléatoire, puis
‫nous avons la chaîne cryptée ici.
‫Ce rappel est celui qui ne devrait pas être dans la base
‫de données, se terminant donc par a901.
‫Jetons un coup d'oeil à cela.
‫Et en effet, le voici,
‫jeton de réinitialisation de mot de passe se terminant par ce a901.
‫Et aussi la date, qui est en fait dans 10 minutes.
‫Vous savez maintenant à quelle heure j'enregistre cette vidéo.
‫Quoi qu'il en soit, mais cela a très bien fonctionné.
‫C'est donc en fait la première partie
‫de la création de cette fonctionnalité de réinitialisation de mot de passe.
‫Dans la vidéo suivante, nous
‫enverrons ensuite ce jeton ici par e-mail à l'utilisateur et avons
‫donc en fait préparé une vidéo distincte
‫uniquement pour apprendre comment envoyer un e-mail avec node
‫à js.
‫C'est très amusant alors
‫n'attendez pas pour vous y installer tout de suite.