‫- : Auparavant, nous
‫avons déjà implémenté une fonctionnalité d'inscription
‫simple, mais
‫dans cette conférence, nous allons également
‫connecter l'utilisateur à un processus d'inscription plus réel.
‫Donc à partir de cette
‫conférence, nous allons vraiment commencer à implémenter notre authentification,
‫et c'est donc là que ça devient vraiment sérieux.
‫Et donc, avant de commencer, je
‫veux vous donner un avertissement
‫ici, donc l'authentification est très difficile à obtenir correctement et
‫de nombreux tutoriels que vous allez trouver
‫lorsque vous recherchez l'authentification
‫avec comme Node. js et Express,
‫beaucoup d'entre eux commettent de nombreuses erreurs graves et
‫simplifient à l'excès des choses qui ne devraient pas être simplifiées.
‫D'accord, cela ne veut pas dire que tous les
‫tutoriels sont mauvais,
‫d'accord, ou qui sont inutiles
‫ou quelque chose du genre, mais je passe vraiment des semaines à
‫rechercher toutes les meilleures pratiques et à
‫affiner et améliorer mon code,
‫pour créer cette section d'authentification que nous allons commencer à
‫implémenter maintenant aussi bien que possible, pour
‫un débutant comme vous, d'accord, et c'est parce que nous
‫devons être vraiment très prudents lors de l'écriture de cette partie de
‫l'application, car rappelez-vous, les données de nos utilisateurs sont en jeu ici
‫, et la confiance dans l'entreprise qui exécute l'application,
‫est également en jeu,
‫et donc la mise en
‫œuvre de l'authentification, est une vraie
‫responsabilité où il ne faut faire aucune erreur du tout.
‫Maintenant, il existe des
‫bibliothèques qui peuvent nous aider à mettre
‫en œuvre l'authentification et l'autorisation et la plus
‫connue s'appelle Passport, mais même
‫une bibliothèque comme
‫celle-ci ne vous enlève pas tout le travail
‫et toute la responsabilité, d'accord.
‫Maintenant, dans ce
‫cas ici, nous allons en fait
‫implémenter toute la logique de protection et d'autorisation de connexion par nous-mêmes,
‫à l'exception bien sûr de l'implémentation du jeton Web Jason dont
‫nous avons parlé dans la dernière vidéo elle-même.
‫D'accord, donc toute la signature et la vérification
‫de tout ça, nous allons les laisser à la bibliothèque WJT,
‫mais le reste, nous allons nous mettre
‫en œuvre au cours des deux prochaines conférences.
‫Maintenant, comme je l'ai mentionné
‫plus tôt, nous avons déjà notre fonction d'inscription ici, mais pour
‫le moment, tout ce
‫qu'elle fait est simplement de créer un
‫nouvel utilisateur, puis de le renvoyer au client.
‫Maintenant, peu de temps après avoir terminé l'enregistrement de ce
‫cours, j'ai
‫remarqué qu'il y avait une faille de
‫sécurité très sérieuse dans cette façon d'inscrire
‫des utilisateurs, donc le problème est qu'en ce
‫moment, nous créons un nouvel utilisateur en utilisant toutes les données
‫qui entrent avec le corps à
‫droite, et donc le problème ici est que comme ça,
‫n'importe qui peut spécifier le rôle en tant que droit d'administrateur, donc fondamentalement,
‫tout le monde peut maintenant simplement s'inscrire en tant qu'administrateur dans notre application,
‫et ce n'est
‫bien sûr pas ce dont nous avons besoin.
‫Donc, encore une fois, il s'agit d'une grave faille de
‫sécurité et nous devrons bien sûr corriger cela
‫et corriger est en fait assez simple.
‫Donc ce dont vous avez besoin à la place de cette
‫ligne de code, qui est
‫sélectionnée ici, c'est ce morceau de code que je viens de mettre ici à l'écran.
‫D'accord.
‫Encore une fois, veuillez supprimer cette ligne de code actuellement
‫sélectionnée ici et la remplacer
‫par le code que je viens de mettre
‫ici à l'écran.
‫Maintenant, quelle est en fait la grande
‫différence ici, eh bien,
‫avec ce nouveau code, fondamentalement, nous n'autorisons que les données dont
‫nous avons réellement besoin dans le
‫nouvel utilisateur, donc juste un nom, l'e-mail, puis les mots de passe.
‫Et maintenant, même si un utilisateur essaie de saisir manuellement un rôle, nous
‫ne le stockerons pas dans le nouvel utilisateur, et
‫il en va de même
‫pour d'autres éléments, comme par exemple une photo.
‫C'est donc la solution rapide et facile à ce problème.
‫Maintenant, ce
‫que cela va faire, c'est que nous ne pouvons plus nous inscrire
‫en tant qu'administrateur, et donc si nous devons
‫ajouter un nouvel
‫administrateur à notre système, nous pouvons alors très simplement créer
‫un nouvel utilisateur normalement, puis aller dans
‫MongoDB Compass, et essentiellement éditer ce rôle là-dedans.
‫Alors modifiez-le
‫manuellement de l'utilisateur à l'administrateur, d'accord.
‫Bien sûr, nous pourrions également définir une route
‫spéciale pour simplement créer
‫des administrateurs, mais ce serait un peu trop.
‫Bon, passons maintenant.
‫Notez simplement que le code dans le reste de
‫la vidéo et toutes les vidéos
‫de ce cours sera bien sûr toujours cette ancienne mauvaise version, d'accord, mais en
‫fait dans le code final qui se
‫trouve dans le référentiel GitHub,
‫j'ai déjà corrigé cela et nous avoir le bon code là-dedans.
‫Quoi qu'il en soit, généralement, lorsque nous nous inscrivons à une application
‫Web, vous êtes également automatiquement connecté, n'est-ce pas, et
‫implémentons donc très rapidement cela ici.
‫Alors connectez le nouvel utilisateur,
‫dès qu'il s'est inscrit, d'accord, et rappelez-vous de
‫la conférence précédente, comment cela fonctionne,
‫tout ce que nous avons
‫vraiment besoin de faire, c'est
‫de signer un jeton Web Jason,
‫puis de le renvoyer à l'utilisateur , d'accord, mais commençons
‫par installer le package MPM que nous allons utiliser
‫pour tout ce qui concerne les
‫jetons Web Jason.
‫Donc, dans notre autre terminal, disons
‫l'installation de MPM, le jeton Web Jason, donc tout cela ensemble comme ceci
‫et cela devrait ensuite installer
‫ce paquet et allons de l'avant et
‫jetons-y un
‫coup d'œil sur GitHub, juste pour voir
‫la documentation et allons faites-le
‫ici, nous n'avons
‫plus besoin de celui-ci ici pour le
‫moment au moins, et cela nous amènera donc à la page sur MPM, et ainsi
‫vous verrez à quel
‫point ce paquet est populaire, nous
‫en avons donc 2. 3 millions de téléchargements
‫hebdomadaires, donc c'est vraiment une tonne de téléchargements
‫et nous pouvons également consulter la documentation ici,
‫mais personnellement, je préfère le faire sur GitHub.
‫Je pense que ça a l'air beaucoup plus
‫propre ici, et j'y suis
‫tellement habitué à ce stade, et donc je le vois généralement ici, d'accord.
‫Quoi qu'il en soit, la première fonction
‫que nous allons utiliser avec JWT ici est le signe, d'accord,
‫donc pour créer un nouveau jeton, et pour cela, bien sûr,
‫nous avons besoin de la charge
‫utile, nous avons besoin de la clé pour que
‫le secret
‫privé que j'ai mentionné avant que cela ne
‫soit stocké sur notre serveur et
‫que nous devons signer le jeton, puis
‫nous pouvons transmettre certaines options et nous
‫ferons tout cela en une seconde, je veux juste montrer
‫l'autre fonction que nous avons ici, et que nous
‫avons vraiment avons une tonne d'options ici,
‫par exemple l'expiration dans, que nous allons
‫utiliser également, donc tout cela
‫et ensuite nous devons vérifier.
‫Nous avons donc également parlé du processus de
‫vérification et c'est essentiellement implémenté dans cette fonction, d'accord, et c'est
‫donc celui que nous allons
‫utiliser, lors de la connexion d'un utilisateur, d'accord, et c'est
‫vraiment tout ce qu'il y a,
‫donc vous avez tout ces différentes options
‫ici, d'accord, vous avez
‫également décoder mais celle-ci n'est pas vraiment importante, d'accord,
‫vous voyez donc que ce package n'inclut vraiment que
‫les deux
‫fonctionnalités dont nous avons parlé dans la vidéo précédente.
‫Donc signer et vérifier, d'accord.
‫Revenons donc ici et commençons
‫à utiliser le package de jetons Web Jason.
‫Importons-le donc ici,
‫et il s'appelle généralement simplement
‫JWT et nécessite le jeton Web Jason.
‫D'accord, alors créons notre jeton ici, d'accord, et j'aimerai
‫l'appeler simplement comme
‫ça, donc juste un jeton, d'accord, puis le signe
‫de point JWT, et maintenant la première chose est la charge utile, et
‫c'est fondamentalement un objet pour tous les
‫données que nous allons stocker à
‫l'intérieur du token, et dans ce cas,
‫nous
‫ne voulons vraiment que l'ID de l'utilisateur, d'accord, donc rien
‫de fou ici, pas beaucoup de données qui
‫ne sont pas vraiment importantes.
‫Donc, nous disons que l'ID est, puis
‫nous obtenons simplement l'ID du nouvel
‫utilisateur qui vient d'être créé, d'accord, donc le
‫nouveau point d'utilisateur, puis rappelez-vous que dans MonogoDB, l'ID s'appelle en fait
‫l'ID de soulignement, d'accord, et ainsi est l'objet qui correspond
‫aux données, la charge
‫utile, que nous voulons mettre dans notre JWT.
‫Ensuite, nous avons besoin du secret, d'accord, donc
‫en gros une
‫chaîne pour un secret, d'accord,
‫bien sûr, c'est un secret terrible, d'accord, c'est juste
‫une sorte d'espace réservé car
‫en fait, notre fichier de configuration est
‫un endroit parfait pour stocker ce genre de données secrètes, comme
‫le mot de passe par exemple, et donc
‫allons ajouter et éditer ici, d'accord, alors appelons-le JWT, secret, et bien
‫sûr le nom que nous donnons ici, n'a pas vraiment d'importance mais ce
‫qui compte, c'est le secret que
‫nous
‫spécifions ici, d'accord, car en utilisant le cryptage standard HSA
‫256 pour la signature, le secret devrait avoir au moins trente-deux caractères, d'accord, mais le
‫plus long sera le mieux en fait et c'est là
‫que beaucoup les tutoriels échouent, certains d'entre
‫eux mettent simplement une chaîne
‫très courte ici, mais ce n'est pas
‫encore l'idéal, donc pour un meilleur cryptage de la
‫signature, encore une fois,
‫vous devriez utiliser au moins trente-deux
‫caractères, donc je vais créer mon secret ici maintenant mais vous
‫devriez vraiment vraiment en
‫utiliser un autre, d'accord, s'il vous plaît, n'utilisez pas
‫le sa moi un comme je le fais
‫car cela pourrait devenir un problème
‫de sécurité pour votre
‫application, d'accord, utilisez toujours un secret unique pour vos applications
‫et jamais le même, d'accord,
‫et surtout pas celui de quelqu'un d'autre donc
‫certainement pas celui que je je tape maintenant.
‫Donc ça peut être
‫n'importe quoi, ça n'a pas besoin d'être
‫des personnages ou des trucs bizarres, je
‫préfère utiliser une phrase comme ça,
‫mon secret ultra sécurisé et ultra long, alors qu'est-ce qui
‫s'est passé ici, de
‫toute façon ça devrait faire trente-deux caractères et ainsi c'est
‫celui que
‫nous allons utiliser pour mes jetons Web Jason, mais
‫encore une fois, veuillez en utiliser un autre, d'accord.
‫Quoi qu'il en soit, revenons au contrôleur d'authentification ici,
‫et utilisons-le maintenant.
‫Alors n'oubliez pas qu'une variable
‫d'environnement est un processus point fin point secret JWT,
‫d'accord.
‫Donc, à ce stade, nous avons la charge
‫utile et nous avons le secret.
‫L'en-tête du jeton sera en fait créé automatiquement, mais maintenant,
‫ce que nous
‫pouvons également faire, c'est transmettre
‫certaines options, et l'option que je vais
‫transmettre correspond au moment où le JWT doit expirer.
‫Cela signifie donc qu'après le temps
‫que nous allons passer
‫ici, le jeton Web Jason
‫ne sera
‫plus valide, même s'il serait sinon correctement
‫vérifié, d'accord, il
‫s'agit donc essentiellement de déconnecter un utilisateur
‫après un une certaine période de
‫temps simplement par mesure de sécurité, d'accord.
‫Définissons donc en fait ce délai d'expiration également en tant
‫que variable de configuration ici,
‫donc JWT expire et donc ici, bien sûr, vous pouvez utiliser le
‫même temps que celui que
‫je mets.
‫Nous pouvons donc utiliser
‫une chaîne spéciale comme par exemple 90D
‫et l'algorithme de signature déterminera alors automatiquement
‫que cela signifie quatre-vingt-dix jours, d'accord, vous pouvez également utiliser
‫dix heures ou cinq minutes ou trois secondes ou quelque chose comme ça, ou
‫n'importe quel nombre , qui sera
‫alors traité
‫comme des millisecondes mais je pense qu'il
‫est préférable d'utiliser simplement quatre-vingt-dix ou quelque
‫chose de D, donc dans ce cas, quatre-vingt-dix jours, d'accord,
‫et encore une fois,
‫après quatre-vingt-dix jours, le JWT ne sera plus
‫valide, même si la signature est correcte et tout est valide.
‫D'accord, encore une fois, juste comme une mesure de
‫sécurité
‫supplémentaire, d'accord, donc ces options comme toujours, nous
‫les avons transmises en tant qu'objet,
‫puis spécifions l'expiration, donc expire, puis traite la fin du point, puis
‫JWT expire, d'accord, et ceci ici ajoutera ensuite des données supplémentaires à
‫la charge utile, mais ce
‫n'est bien sûr
‫pas un problème du tout.
‫Nous venons donc de créer un
‫jeton, il ne
‫nous reste plus qu'à l'envoyer au client.
‫Mettons-le donc ici avant l'utilisateur en fait
‫et puis c'est tout.
‫C'est vraiment tout ce que nous devons faire pour
‫connecter un nouvel utilisateur,
‫car pour le moment
‫nous ne vérifions pas si un mot de passe est
‫correct ou si l'utilisateur
‫existe réellement dans la base de
‫données
‫car ici, dans ce cas, l'utilisateur
‫vient juste d'être créé, et donc tout
‫de suite, nous avons connecté l'utilisateur
‫à l'application en envoyant un jeton, d'accord, et
‫l'utilisation du client devrait alors, d'une certaine manière,
‫stocker ce jeton,
‫comme nous en avons déjà parlé dans la conférence précédente, d'accord, alors faisons une
‫sauvegarde ici, et essayons réellement, d'accord, alors laissez-nous mon
‫ancienne adresse ici, bonjour@jonas. io, envoyons-le, et attendons-le
‫et en effet, voici notre token Web
‫Jason alors félicitations, vous venez de créer votre tout premier token
‫Web Jason qui devrait ressembler un
‫peu à ça, et bien sûr ça ne
‫ressemblera pas exactement à idem, car notre
‫secret n'est pas non plus le même, n'est-ce
‫pas, et maintenant ce que je veux vous montrer,
‫c'est le débogueur JWT,
‫que je vous ai montré en
‫capture d'écran plus tôt dans la
‫dernière vidéo.
‫Alors allons de l'avant et
‫copions ce jeton, puis passons à JWT. io, d'accord, alors en bas
‫nous
‫avons le débogueur et supprimons
‫donc celui-ci ici, et mettons le nôtre et tout
‫de suite vous voyez que notre
‫signature est invalide, mais c'est parce que
‫la fonction de signature édite ces deux
‫propriétés ici, parce
‫que nous avons spécifié une expiration date essentiellement.
‫Donc ceci ici est émis à, et
‫c'est l'heure d'expiration, d'accord, donc si nous
‫supprimons ces deux d'ici, vous verrez que maintenant, cette signature
‫est en
‫fait vérifiée, d'accord, donc ce qui
‫est important à noter ici, c'est que bien sûr l'en-tête
‫est visible d'accord c'est facilement décodable en
‫gros, et donc vous que nous n'avons rien
‫spécifié de tout cela, c'est le package de
‫jetons Web Jason qui l'a fait pour nous, mais c'est
‫en fait la charge utile que nous avons spécifiée, donc si
‫nous jetons un coup d'œil à
‫cet ID, ça devrait être exactement le même que
‫nous avons dans facteur, donc finissant sur
‫six OF, et donc effectivement, c'est exactement le même droit,
‫d'accord, donc ces deux là sont ouverts
‫et puis la signature bien sûr, on ne peut pas
‫vraiment voir, parce que bien sûr notre secret
‫est juste ça, c'est vraiment secret, d'accord, donc c'était
‫juste pour vous montrer que tout fonctionne, et terminons
‫ceci, et oui, nous
‫ne pouvons pas connecter les utilisateurs, mais uniquement si l'utilisateur vient de
‫s'inscrire, car dans ce cas, nous n'avons
‫pas besoin de vérifier l'e-mail dans la base
‫de données, ni
‫le mot de passe, d'accord.
‫Donc, faire tout cela est un processus beaucoup plus complexe, et
‫c'est donc en fait ce que nous
‫allons faire dans la prochaine
‫conférence, donc ensuite, nous allons réellement connecter les utilisateurs, en
‫fonction de leur adresse e-mail et de leur mot de passe.