‫Jonas : Donc,
‫dans cette conférence, nous allons implémenter la
‫fonctionnalité de connexion des utilisateurs en fonction d'un mot de passe et
‫d'une adresse e-mail donnés.
‫Et comme auparavant, le concept de connexion d'un utilisateur signifie
‫essentiellement qu'il faut signer un jeton Web JSON
‫et le renvoyer au client.
‫Mais dans ce cas, nous n'émettons le jeton que
‫dans le cas où l'utilisateur existe réellement et
‫que le mot de passe est correct.
‫Alors, commençons à mettre cela en œuvre.
‫Exportations. la connexion est...
‫demande, répond et suivant.
‫Et la première chose est de lire
‫l'e-mail et le mot de passe du corps.
‫Disons donc que const email est égal à req. corps. e-mail.
‫D'accord, et maintenant eslint nous donne cet avertissement, ou cette
‫erreur en fait, et il dit
‫que nous devrions utiliser la déstructuration d'objet, d'accord ?
‫Et donc je laisse cela se produire ici
‫exprès juste pour que je puisse vous montrer comment nous
‫pouvons le faire avec la déstructuration ES6.
‫Et je pense en avoir déjà parlé dans le cours, et
‫j'espère aussi que vous connaissez déjà le
‫concept, mais de toute façon, puisque le
‫nom de cette propriété ici
‫est le même que le nom de
‫la variable, on peut simplement le faire
‫comme ceci et supprimez le nom de la propriété ici, d'accord ?
‫Et aussi nous voulons obtenir le mot de passe.
‫Et donc ce serait la même chose, donc
‫fondamentalement, le mot de passe équivaut à une demande. corps. le mot de passe.
‫Et au lieu
‫de faire cela, nous pouvons simplement créer un e-mail et un mot de passe.
‫Et donc juste comme ça,
‫nous créons essentiellement ces deux variables de l'objet corps, d'accord ?
‫Donc, en gros, c'est ainsi que
‫l'utilisateur va envoyer les informations de connexion pour que nous puissions les vérifier.
‫D'accord, et ce processus de vérification comporte quelques
‫étapes, alors exposons-les ici
‫avant de commencer à coder.
‫Donc, nous devons d'abord vérifier si l'e-mail
‫et les mots de passe existent réellement, d'accord ?
‫Ensuite numéro deux, vérifiez si l'utilisateur existe, et en
‫même temps si le mot de passe est correct.
‫Et troisièmement, si tout
‫va bien, renvoyez le jeton, donc le jeton Web JSON au client.
‫D'accord, donc le premier est très facile.
‫Donc, s'il n'y a pas d'email ou pas de mot de passe, alors
‫nous voulons envoyer un message d'erreur à notre client.
‫Maintenant, comment allons-nous faire ?
‫Eh bien, nous allons le faire
‫en utilisant les outils que nous avons implémentés dans la dernière section.
‫Donc, en gros, notre erreur d'application, vous vous en souvenez ?
‫Nous allons donc simplement créer une nouvelle
‫erreur ici, et notre middleware
‫global de gestion des erreurs la récupérera et renverra cette erreur au client.
‫Et commençons donc par importer cette erreur.
‫Alors rappelez-vous qu'il s'agit
‫de celui-ci de notre classe AppError, n'est-ce pas ?
‫Alors disons AppError, puis require.
‫Donc un niveau supérieur à partir d'ici, puis dans les utilitaires,
‫puis appError.
‫D'accord, nous devons donc appeler le prochain middleware, et
‫c'est là que nous passons l'erreur, vous vous en souvenez ?
‫Donc nouvelle erreur AppError, et le message
‫est : veuillez fournir une adresse e-mail et un mot de passe.
‫Et le code d'erreur HTTP est 400 pour une mauvaise requête, d'accord ?
‫Et maintenant, j'ai quelques
‫erreurs ici, et c'est encore une fois eslint qui m'aide à corriger certains bogues.
‫Donc je vois que
‫là-haut, encore une fois, je l'ai utilisé avec un T au
‫lieu de D, et si je le sauvegarde maintenant, tout est correct.
‫D'accord, et commençons donc à tester cela tout de suite.
‫Et pour cela
‫je vais simplement commencer par créer un faux jeton ici pour le moment, d'accord.
‫Et alors disons res. statut 200 pour d'accord.
‫JSON, puis bien sûr, comme
‫toujours, le statut défini sur succès, puis également notre jeton.
‫Et c'est en fait tout ce que
‫nous allons envoyer en réponse à la connexion, d'accord ?
‫Donc pas d'objet utilisateur car ce n'est pas du tout nécessaire.
‫Tout ce que nous voulons comme réponse pour la connexion,
‫c'est en fait le jeton.
‫C'est tout ce qui compte lorsque l'utilisateur se connecte.
‫Ensuite, nous devons implémenter la
‫route, alors faisons-le à nouveau dans notre routeur utilisateur, d'accord ?
‫Et celui-ci est en fait assez similaire à celui-ci.
‫Dupliquons-le, puis remplaçons l'inscription dans
‫les deux cas ici par la connexion, d'accord ?
‫Et encore une fois, cela n'est valable que pour une demande
‫de publication, car nous souhaitons bien
‫sûr envoyer les informations de connexion dans le corps.
‫Et encore une fois, c'est
‫un post, mais pas un get, pas un patch, et pas
‫une suppression, car cela n'a aucun sens dans ce cas.
‫Alors testons-le tout de suite.
‫Je vais également copier cette URL ici.
‫Ce sera la publication, la connexion, puis le corps
‫bien sûr.
‫Encore une fois, brut et JSON.
‫Créons donc un corps simple ici.
‫Très bien, essayons donc d'envoyer ceci
‫sans mot de passe, et voyons ce qui se passe.
‫Et en effet, cela fonctionne, nous recevons donc notre message ici :
‫veuillez fournir une adresse e-mail et un mot de passe.
‫Et encore une fois, puisque
‫nous sommes en développement, nous obtenons toute
‫cette pile d'erreurs ici, et l'erreur complète avec notre
‫code d'état, l'état, et aussi bien sûr en
‫disant qu'il s'agit d'une erreur opérationnelle.
‫Donc, comme nous l'avons défini dans la section précédente, d'accord ?
‫Essayons maintenant la même chose avec le mot de passe.
‫Alors, définissez le mot de passe sur Je pense que c'était
‫celui-ci, puis supprimez l'e-mail.
‫Et cela déclenche bien sûr la même chose.
‫D'accord, et avec tout ce qui est correct, cela devrait alors
‫fonctionner, et en effet, nous obtenons notre faux jeton ici.
‫Maintenant, une seule chose que nous devrions faire
‫ici est de revenir également.
‫Nous l'avons donc fait plusieurs fois auparavant,
‫et permettez-moi de l'expliquer à nouveau.
‫C'est simplement parce qu'après avoir appelé le prochain
‫middleware, nous voulons nous assurer que cette
‫fonction de connexion se termine tout de suite, d'accord ?
‫Et comme nous n'avions pas
‫cela auparavant, vous voyez à nouveau cette erreur ici.
‫Donc, c'est déjà un peu familier à ce stade, n'est-ce pas ?
‫Impossible donc de définir des en-têtes après leur envoi au client,
‫car encore une fois, nous avons envoyé deux réponses.
‫D'abord la réponse d'erreur, puis ce code exécuté ici, ce qui n'aurait bien
‫sûr pas dû le faire.
‫Et encore une fois, nous utilisons return here pour résoudre ce problème.
‫Bon, maintenant, vérifions s'il y a réellement un utilisateur
‫pour l'e-mail qui a été posté.
‫Donc const user, et donc utilisons maintenant le findOne en fait, car cette
‫fois nous ne sélectionnons pas un utilisateur par l'ID,
‫mais plutôt par son email, n'est-ce pas ?
‫Et donc nous devons passer cet objet
‫de filtre où nous pouvons dire email égal à email, d'accord ?
‫Le champ est donc appelé
‫email, et la variable est également appelée email.
‫Et donc dans ES6, nous pouvons abréger cela simplement comme ceci.
‫Maintenant, avant de continuer ici,
‫il y a en fait quelque
‫chose d'important que je dois faire pour la sécurité.
‫Alors laissez-moi vous montrer cela dans
‫Postman, où nous avons ouvert un nouveau compte.
‫Et donc vous voyez ici que dans la
‫sortie utilisateur, nous obtenons en fait le mot de passe, d'accord ?
‫Il est crypté en fait, mais ce
‫n'est quand même pas une bonne pratique de divulguer les
‫données du mot de passe au client, d'accord ?
‫Par exemple, si nous avions notre get all users ici,
‫et que cette route n'est pas encore
‫implémentée, mais si nous devions obtenir tous les utilisateurs de la collection,
‫alors tous auraient le mot de
‫passe visible, et nous ne voulons pas que , d'accord?
‫Et donc le réparer est en fait assez facile,
‫car nous l'avons fait avant.
‫Tout ce que nous avons à faire
‫est de dire le mot de passe, puis de le sélectionner et de le définir sur faux.
‫Et donc comme ça, il n'apparaîtra automatiquement dans
‫aucune sortie.
‫Et de me laisser
‫vous prouver cela en vous inscrivant comme autre chose, donc comme ça.
‫Et voyons, oh, en fait, nous avons
‫déjà un utilisateur avec cet e-mail, alors faisons juste test3.
‫Et maintenant, le mot de passe est toujours là, mais je suppose
‫que c'est simplement parce que nous pourrions simplement le créer, ce
‫nouveau document ici, et
‫donc il ne le sélectionne pas vraiment parce
‫que nous ne le lisons pas dans la base de données.
‫Implémentons donc très
‫rapidement cette route ici,
‫cela ne prendra qu'une minute.
‫Donc juste pour voir si cela fonctionne réellement ici.
‫Parce que cette étape est en
‫fait importante pour ce que nous allons faire ensuite, d'accord ?
‫Alors allons-y et copions ce code à partir de getAllTours,
‫et pas vraiment, mais ce que nous allons faire
‫est assez similaire à cela bien sûr.
‫Je vais donc simplement copier
‫ceci, mais sans les fonctionnalités de l'API.
‫Donc ça ne m'intéresse pas vraiment, d'accord ?
‫Et donc celui-ci que
‫je vais faire dans le contrôleur utilisateur, car obtenir tous les
‫utilisateurs n'a rien à voir avec l'authentification.
‫Et donc dans ce cas,
‫le contrôleur utilisateur est l'endroit idéal pour le faire.
‫Maintenant, bien sûr, j'ai également besoin d'importer
‫rapidement le modèle utilisateur ici, et nous allons
‫donc également le copier à partir du tourController, qui n'est pas le même mais similaire.
‫Alors saisissons en fait tout cela dans
‫notre contrôleur utilisateur.
‫Nous n'avons pas besoin de celui-ci, mais nous devons également catchAsync.
‫OK, donc la tournée sera
‫user, et ici ce sera userModel, d'accord ?
‫Ensuite, ici, nous avons des visites, et ici et ici,
‫alors j'appuie sur Commande + D pour les
‫sélectionner toutes et les changer en utilisateurs.
‫Et puis ici bien sûr ce que nous attendons, c'est User. trouve.
‫Maintenant que nous
‫avons un wait ici, nous avons besoin d'async, puis nous avons également besoin de next,
‫et puisque nous avons un
‫async ici, nous devrions alors envelopper le tout dans un catch async.
‫Alors faisons-le.
‫D'accord, et à ce
‫stade, ce n'est plus nouveau pour vous,
‫nous sommes déjà habitués à faire ce genre de choses, n'est-ce pas ?
‫Donc, cela devrait déjà fonctionner à
‫ce stade, alors essayons-le.
‫Récupérez donc tous les utilisateurs, et maintenant, en effet, nous voyons que
‫leur mot de passe n'est pas inclus dans la sortie.
‫Et c'est important parce qu'en fait, dans la recherche, donc de
‫retour ici dans AuthController, celui-ci
‫ne contiendra désormais plus le mot de passe, d'accord ?
‫Et donc la sortie de
‫ceci ici ne contiendra désormais plus le mot de passe.
‫Mais nous avons besoin du mot de passe pour vérifier
‫s'il est correct, n'est-ce pas ?
‫Et donc nous devons également le sélectionner explicitement.
‫Alors, rappelez-vous comment nous utilisions select auparavant pour
‫sélectionner simplement quelques champs de la base
‫de données, uniquement ceux dont nous avions besoin ?
‫Maintenant, dans ce cas, lorsque nous
‫voulons que le champ qui est par défaut
‫n'est pas sélectionné, nous devons user plus puis le nom du champ.
‫Donc mot de passe dans ce cas.
‫Et donc comme ça, il sera de retour dans la sortie, d'accord ?
‫Bien sûr, nous devons attendre
‫cette requête, puis marquer la fonction comme asynchrone.
‫Et puis
‫comme avant, afin d'éviter ce bloc try
‫catch laid, enveloppez toute cette fonction dans catchAsync.
‫D'accord, c'est logique ?
‫Alors maintenant, connectons rapidement l'utilisateur à la console, juste pour voir
‫si cela fonctionne.
‫Alors celui-ci ici.
‫Nous obtenons notre succès, et en effet nous obtenons l'utilisateur ici.
‫Donc, avec exactement l'e-mail que je viens de publier,
‫le mot de passe est maintenant également de nouveau inclus
‫dans la sortie, d'accord ?
‫Et encore une fois, c'est parce que nous l'avons explicitement sélectionné ici.
‫Et maintenant, il est temps de comparer les mots
‫de passe que nous avons dans la base de
‫données avec celui que l'utilisateur vient de publier.
‫Mais comment va-t-on faire ça ?
‫Parce que, par exemple, le mot de
‫passe peut être, ou est dans cet exemple, pass1234,
‫mais celui que nous avons stocké dans le document ressemble à ceci.
‫Alors, comment allons-nous comparer cela?
‫Il n'y a pas vraiment moyen de le faire, non?
‫Mais en fait, tout ce que nous
‫avons à faire est d'utiliser à nouveau le package bcrypt, d'accord ?
‫Nous avons donc utilisé bcrypt pour générer ce mot de passe haché, et
‫nous pouvons également utiliser le même
‫package pour comparer essentiellement un mot de passe d'origine comme celui-ci ici avec le
‫mot de passe haché.
‫Bien sûr, ce mot de passe ici, puisqu'il est crypté, il n'y
‫a aucun moyen de récupérer l'ancien, donc
‫le mot de passe d'origine de cette chaîne, n'est-ce pas ?
‫C'est donc tout
‫l'intérêt du chiffrement d'un mot de passe.
‫Et donc la seule
‫façon de le faire est que
‫ce package pour cet algorithme crypte également ce
‫mot de passe, puis le compare avec celui crypté, d'accord ?
‫Implémentons donc une fonction qui va faire cela,
‫et pour cela nous utiliserons, encore une fois, le package bcrypt.
‫Et nous le ferons dans le modèle utilisateur.
‫Et vous pourriez demander « Pourquoi le faisons-nous
‫dans un modèle » et pas seulement ici », mais
‫c'est, encore une fois, parce que cela est vraiment lié aux données elles-mêmes.
‫Et aussi, nous avons déjà ce package là-dedans, et il
‫est donc plus facile de le faire simplement là-bas.
‫Alors, débarrassons-nous simplement de cette chaîne, puis créons
‫une fonction ici, qui
‫vérifiera si le mot de passe donné
‫est le même que celui stocké dans le document.
‫Donc, pour la première fois, nous allons créer quelque
‫chose appelé une méthode d'instance.
‫Donc, une méthode d'instance est fondamentalement une méthode
‫qui sera disponible sur tous les documents
‫d'une certaine collection, d'accord ?
‫Et ça marche comme ça.
‫Encore une fois, c'est défini
‫sur un userSchema, puis nous disons méthodes, et maintenant dans ce
‫cas nous voulons appeler la fonction correctPassword, d'accord ?
‫Donc fonction, maintenant cette fonction va accepter un
‫candidatPassword, donc le mot
‫de passe que l'utilisateur passe dans
‫le corps, et puis aussi le userPassword, d'accord ?
‫Désormais, à l'intérieur de ces méthodes
‫instanciées, puisqu'elles sont disponibles sur le document,
‫le mot-clé this pointe en fait vers le document actuel.
‫Mais dans ce cas, puisque nous avons
‫le mot de passe défini pour sélectionner false, alors c'est ici, vous vous souvenez ?
‫D'accord, et à
‫cause de ça, ça. le mot de passe ne sera pas disponible.
‫Donc, idéalement, nous le ferions comme ceci, et
‫de cette façon,
‫nous n'aurions qu'à passer le candidatPassword et non le userPassword.
‫Mais encore une fois, ce n'est pas possible pour
‫le moment car le mot de passe n'est pas disponible dans la sortie.
‫Et c'est
‫pourquoi nous devons également transmettre userPassword.
‫Le but de cette
‫fonction est donc de ne renvoyer que vrai ou faux.
‫Donc fondamentalement vrai si les mots de passe sont
‫les mêmes, et faux sinon.
‫Alors revenez, puis bcrypt que nous connaissons déjà, puis nous
‫allons utiliser la fonction de comparaison, d'accord ?
‫Et la fonction de comparaison est
‫vraiment simple, tout ce dont nous avons besoin
‫est de passer le candidatPassword et le userPassword, pas userSchema, userPassword, d'accord ?
‫Et tout comme la fonction de
‫hachage ici, celle-ci est également une fonction asynchrone.
‫Et donc, comme avant, nous utilisons wait, puis ici async.
‫D'accord, ça a du sens ?
‫Donc encore une fois, cette fonction de comparaison
‫ici retournera très simplement vrai
‫si ces deux mots de passe ici sont les mêmes, et faux sinon.
‫Et encore une fois, nous ne
‫pouvons pas les comparer manuellement car le mot de
‫passe candidat n'est pas haché, c'est donc le mot
‫de passe d'origine provenant de l'utilisateur, mais userPassword
‫est bien sûr haché, et donc sans cette
‫fonction ici, nous n'aurions aucun moyen de les comparer, d'accord ?
‫Donc ici, nous retournons true ou false,
‫maintenant tout ce que nous avons à faire est d'appeler
‫cette fonction dans le authController.
‫Fermons-en quelques-uns.
‫Très bien, donc c'était ici seulement pour la démonstration.
‫Appelons simplement ceci ici correctement, et rappelons-nous
‫maintenant que la fonction que nous venons de définir
‫est une méthode instanciée.
‫Elle est donc disponible sur tous les documents utilisateurs.
‫Et donc cette variable ici en ce moment
‫est un document utilisateur, n'est-ce pas ?
‫Parce que c'est le résultat de l'interrogation du modèle utilisateur.
‫Et donc nous pouvons maintenant dire utilisateur. mot de passe correct.
‫Maintenant, tout ce que nous avons à faire est de transmettre le mot de passe
‫candidat, qui est le mot de passe, rappelez-vous.
‫Donc celui-ci ici, puis le userPassword.
‫Et donc c'est dans user. mot de passe, d'accord ?
‫Et donc ceci ici sera maintenant soit vrai, soit faux.
‫Très bien, et maintenant utilisons ces deux variables afin
‫de déterminer si l'utilisateur existe et si le
‫mot de passe est correct.
‫Nous avons donc déjà
‫compris cela, mais maintenant nous devons réellement écrire notre instruction if.
‫Donc, s'il n'y a pas d'utilisateur ou si le mot de passe est incorrect,
‫alors fondamentalement correct est faux, c'est ce que cela signifie.
‫Dans ce cas, nous voulons, encore une fois,
‫revenir et passer directement à notre prochain middleware avec une
‫nouvelle AppError.
‫Et dans ce cas, dire un e-mail ou un mot de passe incorrect, d'accord ?
‫Et puis le code d'état est
‫401, ce qui signifie non autorisé, d'accord ?
‫Maintenant, nous aurions pu le faire
‫séparément, alors vérifiez d'abord
‫l'utilisateur, puis le mot de passe correct.
‫Mais dans ce cas, nous donnerions alors à un
‫attaquant potentiel des informations indiquant si l'e-mail ou le mot de passe est incorrect.
‫Et comme ça ici c'est un peu plus vague.
‫Nous ne spécifions donc pas vraiment ce qui est incorrect ici.
‫Donc si c'est l'email ou si c'est le mot de passe.
‫Et donc s'il y a
‫un attaquant qui essaie de mettre des données aléatoires,
‫alors ils ne sauront pas si l'e-mail existe réellement,
‫ou si c'est juste le mot de passe qui est faux, d'accord ?
‫Maintenant, juste deux choses ici, et la première
‫est que nous devons en
‫fait attendre cette fonction asynchrone, d'accord ?
‫Rappelez-vous donc que le mot de passe
‫correct est une fonction asynchrone,
‫et donc ici, nous devons également attendre cela.
‫Et puis il y a aussi
‫un autre problème, car cet utilisateur n'existe pas
‫ici, alors cette prochaine ligne de code ne peut pas vraiment s'exécuter, d'accord ?
‫Parce que par exemple, user. le mot de
‫passe ne sera pas disponible.
‫Et donc nous devons en fait déplacer tout cela,
‫ou en fait uniquement ce
‫code, nous allons le déplacer ici dans l'instruction if else.
‫D'accord, et ainsi de cette façon, si
‫l'utilisateur n'existe pas, donc si c'est vrai, alors il n'exécutera même
‫pas ce code ici, et alors il
‫n'y aura pas de problème.
‫Mais si l'utilisateur existe, il exécutera également ce code et vérifiera
‫si le mot de passe est réellement correct.
‫Et donc si le mot de
‫passe est correct, ce n'est que dans ce cas que nous atteignons ce morceau de code ici.
‫C'est donc toute l'idée de cette fonction.
‫Donc, en gros, nous vérifions les points négatifs.
‫Donc, s'il n'y a pas d'e-mail et pas de mot
‫de passe, nous obtenons cette erreur.
‫S'il n'y a pas d'utilisateur ou s'il y a un mauvais
‫mot de passe, créez cette erreur.
‫Mais s'il n'y a eu aucune
‫erreur, eh bien, dans ce cas, nous atteignons cette partie du
‫code, où nous générons maintenant
‫un jeton, puis nous le renvoyons à l'utilisateur.
‫Maintenant, la création de ce jeton va être exactement la même chose
‫que nous l'avons fait avant ici.
‫Et donc au lieu de répéter tout
‫ce code, créons en fait une fonction pour cela, d'accord ?
‫Je vais donc
‫copier ce code, puis ici très rapidement const
‫signToken, qui va recevoir comme seule entrée l'ID utilisateur.
‫Donc ID, et il renverra ensuite le jeton, d'accord ?
‫Il va donc simplement signer ceci et le retourner tout de suite.
‫Très bien, et donc ici, ce que
‫nous allons faire, c'est signer le jeton et transmettre cet identifiant.
‫Et puis, bien sûr, nous devons également le changer ici, d'accord ?
‫Définissez donc cet ID sur cet ID, qui, comme
‫vous le savez déjà à ce stade, est le même que celui-ci.
‫Très bien, alors allons-y maintenant et faisons de même ici.
‫signToken, et dans ce cas c'est user. _identifiant.
‫Ouf, c'était une longue
‫conférence, allons-y maintenant et essayons-la.
‫Cela devrait donc maintenant fonctionner.
‫Alors rappelez-vous, eh bien, c'est maintenant un autre utilisateur, mais je sais que c'est
‫le mot de passe que j'ai utilisé.
‫Alors pour l'instant, utilisons-en un autre,
‫alors testez 12, et voyons ce qui se passe.
‫Attendons, et en effet, e-mail ou mot de passe incorrect.
‫Et donc nous obtenons bien sûr aussi notre
‫401, et en effet cela signifie que notre code teste déjà le mot
‫de passe actuellement.
‫Donc, si nous choisissons maintenant le bon mot de passe,
‫alors il devrait passer, alors attendons-le.
‫Mais, nous obtenons toujours cette erreur.
‫Eh bien, débarrassons-nous simplement de tous nos utilisateurs ici, juste
‫pour nous assurer que cela
‫n'a rien à faire avec les utilisateurs, puis créons-en un nouveau, d'accord.
‫Alors bonjour@jonas, et pass1234.
‫Allons-y et copiez-le, je vais l'envoyer maintenant.
‫Et donc ces informations d'identification sont maintenant correctes à coup sûr.
‫Donc, si cela ne fonctionne pas maintenant, il y a une sorte de bogue.
‫Mais maintenant, en fait, cela a fonctionné, super.
‫Voici donc notre jeton, et il ressemble exactement à avant, nous
‫pouvons donc supposer qu'il est correct.
‫Essayons maintenant à nouveau, en supprimant ceci, d'accord.
‫Et donc avec un mauvais mot de passe ça ne marche pas.
‫Mettons maintenant le mot de passe correct et l'email incorrect, puis nous
‫obtenons la même erreur.
‫Donc email ou mot de passe incorrect.
‫Et encore une fois, si nous remettons tout en
‫place, nous obtenons un nouveau jeton.
‫Et donc nous sommes maintenant vraiment connectés à l'application.
‫Et je sais que cela peut sembler un peu abstrait,
‫donc tout ce que nous obtenons vraiment est un jeton, et cela signifie que
‫nous sommes connectés à l'application, n'est-ce pas ?
‫Mais bon, c'est comme ça que ça marche sur l'authentification sans état.
‫Plus tard, lorsque nous créerons vraiment le site Web
‫dynamique, il sera bien sûr beaucoup
‫plus visible si l'utilisateur est connecté ou déconnecté, n'est-ce pas ?
‫Mais cela fonctionnera toujours dans les coulisses
‫en utilisant ce même jeton.
‫Donc, s'il n'y a pas de jeton, le site Web aura une apparence
‫dans un sens, et s'il y a
‫un jeton, le site Web aura une autre apparence,
‫avec l'image de l'utilisateur et le nom d'utilisateur directement sur le site Web, par exemple.
‫Quoi qu'il en soit, ce fut une assez longue conférence.
‫Assurez-vous de revenir ici et d'essayer vraiment de
‫comprendre tout ce code que nous avons ici, d'accord ?
‫Parce que je sais que certains
‫de ces éléments peuvent être un peu déroutants.
‫Par exemple, cette fonction correctPassword ici.
‫Et puis je suis sûr que tout aura un sens pour vous.