‫-: Content de te revoir.
‫Nous avons donc implémenté
‫l'authentification dans notre projet jusqu'à présent.
‫Et, ça marche très bien.
‫Cependant, parfois, simplement s'authentifier, donc connecter
‫un utilisateur, n'est vraiment
‫pas suffisant.
‫Et, donc dans
‫cette vidéo, nous allons également implémenter l'autorisation.
‫Alors, imaginez l'acte de supprimer une visite de
‫notre base de données.
‫Ainsi, tous les utilisateurs ne devraient bien sûr pas
‫être autorisés à le faire.
‫Même si l'utilisateur est connecté, n'est-ce pas ?
‫Ainsi, nous avons essentiellement besoin d'autoriser
‫uniquement certains types d'utilisateurs, pour
‫effectuer certaines actions.
‫Et c'est exactement ce qu'est l'autorisation.
‫Il vérifie si un certain utilisateur a les
‫droits d'interagir avec une certaine ressource.
‫Donc, encore une fois, avec l'autorisation, nous vérifions essentiellement
‫si un certain utilisateur est autorisé à accéder à une certaine ressource,
‫même s'il est connecté.
‫Donc, tous les utilisateurs connectés ne pourront pas effectuer les
‫mêmes actions dans notre API, d'accord ?
‫Et c'est un scénario très courant qui
‫devrait généralement être mis en œuvre dans
‫chaque application Web, d'accord ?
‫Nous allons donc construire une autre fonction
‫middleware ici, cette fois pour restreindre certaines routes.
‫Par exemple, pour supprimer des visites.
‫Donc, cela signifie que nous allons créer une
‫autre fonction middleware ici.
‫Cette fois, pour restreindre certains itinéraires, comme,
‫par exemple, la suppression
‫de circuits, uniquement à certains rôles d'utilisateurs.
‫D'accord?
‫Et laissez-moi vous montrer à quoi cela
‫ressemblerait dans la pratique.
‫Donc ici, dans les
‫itinéraires de tournée, revenons à cet exemple de suppression
‫de tournées, et ajoutons donc un middleware dans la pile ici.
‫Alors authController, protégez.
‫Donc d'abord, nous devons
‫toujours vérifier si un utilisateur est réellement connecté, d'accord ?
‫Donc, si un administrateur essaie de supprimer une visite,
‫il devra toujours vérifier
‫s'il est réellement connecté, n'est-ce pas ?
‫Ainsi, le premier middleware de la pile
‫ici sera toujours celui de protection.
‫Mais ensuite, après celui-ci, nous
‫aurons également le authController. restreindre.
‫Alors restrictTo, d'accord ?
‫Et dans cette fonction nous passerons ensuite des rôles d'utilisateurs,
‫qui seront autorisés à interagir avec cette ressource.
‫Dans ce cas, avec la suppression d'une tournée, d'accord ?
‫Alors définissons celui-ci sur admin.
‫Donc, seulement aux administrateurs.
‫D'accord, et maintenant nous traitons ici des rôles d'utilisateur.
‫Donc, tout comme admin.
‫Et pour le moment, nous n'avons pas cela dans notre modèle d'utilisateur.
‫Et donc implémentons rapidement cela ici.
‫D'accord.
‫Alors, faisons-le.
‫En fait, avant le mot de passe, alors comme ici.
‫Et ici, vous pouvez voir comment notre gestionnaire d'exceptions non
‫capturées fonctionne très bien, car restrictTo
‫n'est pas encore une fonction, n'est-ce pas ?
‫Nous ne l'avons pas encore mis en œuvre.
‫Je l'ai simplement utilisé pour montrer ce
‫que nous allons construire exactement.
‫Et bien sûr, il y
‫a une erreur,
‫et donc nodemon attend maintenant que nous redémarrions le serveur, d'accord ?
‫Quoi qu'il en soit, le rôle ici devrait
‫être du type String, et maintenant je vais utiliser le validateur enum afin
‫de n'autoriser que certains types de rôles ici à spécifier.
‫Et ce sont les utilisateurs généraux, donc les utilisateurs normaux,
‫appelons-les simplement utilisateur.
‫Ensuite, nous avons le
‫guide touristique, nous avons le guide
‫touristique principal et nous avons l'administrateur.
‫Alors, j'appelle juste cet administrateur, d'accord ?
‫Et ces rôles d'utilisateurs que nous avons ici seront
‫bien entendu spécifiques au domaine de l'application.
‫Ainsi, par exemple, lorsque vous gérez un site communautaire, cela
‫n'aura pas beaucoup de sens
‫d'avoir un guide et un guide principal.
‫Au lieu de cela, vous aurez probablement,
‫comme, des modérateurs ou des contributeurs, ou des membres.
‫Ainsi, vous aurez toujours des
‫noms différents, selon le type d'application que vous écrivez.
‫Mais dans notre cas, c'est ce qui a du sens.
‫Ensuite, nous voulons également définir une valeur par défaut ici,
‫de sorte que nous n'avons pas à
‫toujours spécifier le type d'utilisateur que nous créons.
‫Et donc l'utilisateur, l'utilisateur normal, disons, est celui
‫qui va être créé par défaut.
‫Alors allons-y maintenant et
‫supprimons les utilisateurs que nous avons
‫déjà, car ils
‫n'ont aucun rôle, et nous n'avons donc plus besoin d'eux comme ça.
‫D'accord.
‫Et donc allons
‫de l'avant et en créons de nouveaux.
‫Donc, je vais m'inscrire ici en tant que hello@jonas,
‫et ça va maintenant être un utilisateur normal, et maintenant nous n'avons pu obtenir
‫de réponse, et c'est
‫bien sûr parce que nous avons cette erreur ici,
‫et donc, allons très retirez rapidement cette ligne de code.
‫Et maintenant, l'erreur a disparu.
‫Et maintenant, il devrait
‫s'exécuter, et en effet nous avons maintenant
‫cet utilisateur, avec le rôle d'utilisateur, d'accord ?
‫C'est donc notre valeur
‫par défaut, mais créons maintenant un administrateur ici.
‫Et pour que cela
‫soit vraiment clair, mettons-le ici dans l'e-mail également,
‫et maintenant nous devons vraiment spécifier le rôle
‫et définir celui-ci sur admin.
‫Envoyez-le, et maintenant nous avons ici notre administrateur système.
‫Frais.
‫Donc, revenons ici, remettons réellement ce code, et nous allons maintenant faire
‫en sorte que nous puissions
‫réellement passer plusieurs arguments dans ce restrictTo.
‫Donc, je veux que l'administrateur puisse supprimer des visites,
‫mais aussi supprimer un guide.
‫D'accord?
‫Et ajoutons donc cela ici aussi.
‫D'accord?
‫Ainsi, l'administrateur et le guide principal peuvent désormais
‫supprimer des visites, mais pas les guides normaux, ni les utilisateurs normaux.
‫D'accord?
‫Voici donc comment restrictTo va fonctionner,
‫allons-y maintenant et implémentons-le.
‫Donc les exportations. restrictTo, et
‫maintenant, comment allons-nous réellement implémenter cela?
‫Parce qu'habituellement, nous ne pouvons pas passer
‫d'arguments dans une fonction middleware, n'est-ce pas ?
‫Mais dans ce cas, nous le voulons vraiment.
‫Nous voulons transmettre les rôles,
‫qui est autorisé à accéder à la ressource, n'est-ce pas ?
‫Donc, ce cas, l'administrateur et le guide principal.
‫Nous avons donc besoin d'un moyen de transmettre des arguments
‫à la fonction middleware d'une manière
‫qui ne fonctionne généralement pas.
‫Alors, comment allons-nous faire?
‫Eh bien, ici, nous allons en fait créer
‫comme une fonction wrapper, qui renverra ensuite
‫la fonction middleware que nous voulons réellement créer, d'accord ?
‫C'est donc la fonction restrictTo, et
‫ici nous voulons
‫passer un nombre arbitraire d'arguments.
‫Donc, en gros, des rôles.
‫Et donc nous pouvons utiliser la syntaxe des paramètres
‫rest, qui est encore une fois nouvelle dans ES6, et
‫cela créera alors un
‫tableau de tous les arguments qui ont été spécifiés, d'accord ?
‫Nous créons donc cette
‫fonction, et tout de suite nous retournerons une nouvelle fonction.
‫Et c'est la fonction middleware elle-même.
‫Alors, demande, réponse, et ensuite.
‫D'accord?
‫Avoir du sens ?
‫Et donc cette fonction ici
‫aura alors essentiellement accès au paramètre de
‫ce rôle ici, car il y a une fermeture, d'accord ?
‫Donc, juste comme un commentaire ici pour
‫expliquer, les rôles sont un tableau.
‫Ainsi, par exemple, il pourrait s'agir,
‫dans ce cas, d'un administrateur et d'un guide principal, d'accord ?
‫Alors, quand allons-nous donner à un utilisateur l'accès à un certain itinéraire ?
‫Eh bien, en gros, quand son rôle d'utilisateur est
‫à l'intérieur de ce tableau de rôles que nous avons transmis, n'est-ce pas ?
‫Disons donc que nous avons maintenant
‫l'utilisateur normal, qui a un rôle de simple utilisateur,
‫alors écrivons-le ici.
‫Le rôle est maintenant juste utilisateur.
‫Et donc fondamentalement, il n'est pas contenu dans
‫ce tableau, et donc, cet utilisateur n'a pas la permission, d'accord ?
‫Et donc, écrivons cela dans le code.
‫C'est en fait assez simple.
‫Donc, sinon des rôles. include, et d'accord, une fois de
‫plus, include est une très belle méthode de tableau
‫qui est en Java Script disponible sur tous les tableaux, d'accord ?
‫Donc, si ce tableau de rôles n'inclut
‫pas le rôle de l'utilisateur
‫actuel, alors nous n'accordons pas la permission à cet utilisateur.
‫Et où est stocké le rôle de l'utilisateur actuel ?
‫Eh bien, rappelons-nous la ligne de code que nous
‫avons en fait mis en place ici, juste
‫à la fin où nous accordons l'accès à
‫la route protégée, nous
‫stockons l'utilisateur actuel dans la demande. utilisateur.
‫Et rappelez-vous comment ce middleware
‫de protection s'exécute toujours avant restrictTo, n'est-ce pas ?
‫Donc, ici, nous avons d'abord
‫protect, puis restrictTo.
‫Et donc au moment où cette fonction middleware s'exécute
‫ici, celle-ci est déjà terminée
‫et a placé l'utilisateur actuel sur l'objet de demande.
‫Et maintenant, nous pouvons l'utiliser ici.
‫Alors demande. utilisateur. rôle.
‫C'est donc là que le rôle est stocké.
‫Si simple.
‫Dans ce cas, nous créons une nouvelle erreur.
‫Donc, comme avant, et maintenant,
‫nous disons que vous n'avez pas la permission d'effectuer cette action.
‫Et maintenant un nouveau code de statut, qui est 403.
‫Et celui-ci signifie interdit, d'accord ?
‫Il y a
‫donc vraiment un code d'état http spécifique pour
‫ce cas, donc pour l'autorisation en gros, d'accord ?
‫Et bien, sinon, nous appelons simplement le suivant.
‫Et c'est vraiment tout.
‫C'est donc aussi simple que cela.
‫Alors récapitulons rapidement ce que nous venons de faire ici.
‫Donc, ici, nous exécutons d'abord le middleware protect.
‫Ensuite, restrictTo middleware, et
‫seulement si ces deux middlewares passent au suivant,
‫on passe au lead tour.
‫Et donc fondamentalement, ce
‫gestionnaire de route, ou ce contrôleur de route,
‫est protégé et est également restreint par ce
‫middleware que nous venons de créer.
‫Ensuite, dans
‫cette fonction, nous passons tous
‫les rôles autorisés à interagir avec cette ressource.
‫Donc, en gros, qui sont autorisés
‫à exécuter cette fonction de gestionnaire, d'accord ?
‫Et donc, cette fonction restrictTo s'exécutera
‫et renverra la fonction middleware elle-même, d'accord ?
‫Et cette fonction middleware elle-même est en fait celle-ci.
‫Il aura alors, du
‫fait de la fermeture, accès aux rôles, d'accord ?
‫Et donc, disons que le rôle de l'utilisateur actuel, qui
‫est, rappelons-le, stocké dans req. utilisateur. rôle, non?
‫Donc, disons que son rôle est utilisateur, et
‫puisque ce rôle n'est pas dans le tableau de ce
‫rôle, eh bien, nous obtenons alors cette erreur, d'accord ?
‫Et c'est ce que ce rôle. comprend des tests ici pour, d'accord ?
‫Mais bien sûr, s'il est
‫inclus, alors on passe au middleware suivant.
‫Qui encore, est alors le gestionnaire d'itinéraire lui-même.
‫Frais.
‫Donc, j'espère que cela a du sens.
‫Allons-y maintenant et testons-le rapidement.
‫D'accord?
‫Alors maintenant, nous avons
‫ce jeton ici, stocké dans la variable JTW, n'est-ce pas ?
‫Alors rappelez-vous cela de la dernière conférence.
‫Donc, nous sommes dans cet
‫environnement de développement, et voici donc cette variable.
‫Donc exactement celui qui est ici.
‫D'accord?
‫Donc, si nous devions maintenant supprimer
‫une tournée, nous devrions alors spécifier cette variable là-dedans, n'est-ce pas ?
‫Passons donc à l'autorisation, le jeton au porteur,
‫et en fait, il
‫le place déjà ici pour nous.
‫Donc, il sait déjà que
‫c'est celui-ci que nous voulons utiliser, parce que, eh
‫bien, nous l'avons utilisé avant, d'accord ?
‫Maintenant, je veux commencer par vous montrer
‫qu'un utilisateur régulier ne peut pas supprimer une visite maintenant, d'accord ?
‫Et commençons donc par nous connecter en tant qu'utilisateur normal.
‫Et alors c'est bonjour, non ?
‫N'oubliez pas, en ce moment, nous avons hello@jonas. io, qui est un utilisateur normal,
‫et nous avons admin@jonas. io.
‫Et nous avons toujours cet ancien ici, débarrassons-nous en.
‫D'accord.
‫Et donc je vais commencer par hello@jonas. io.
‫D'accord?
‫Donc, en vous connectant, ce jeton va être stocké dans la
‫variable d'environnement, et maintenant nous sommes prêts
‫à supprimer une visite.
‫En fait, nous devons également obtenir une pièce d'identité
‫maintenant, alors obtenons-en une rapidement à partir
‫d'ici, nous allons donc supprimer une de nos tournées ici.
‫Alors utilisons simplement le dernier ici.
‫Donc, l'astronome.
‫D'accord?
‫Et voyons si nous obtenons notre message d'erreur.
‫Et, en effet, vous n'avez pas la permission
‫d'effectuer cette action.
‫Donc, 403.
‫Donc, en effet, ça marche un peu, non?
‫Mais, pour terminer
‫maintenant, connectons-nous bien sûr en tant qu'administrateur.
‫Alors, administrateur.
‫Connexion.
‫Et donc ce jeton est maintenant stocké dans cette variable.
‫Et donc si vous
‫exécutez cela maintenant, nous devrions pouvoir supprimer efficacement la tournée.
‫Je veux voir?
‫Et c'est parti.
‫Nous avons donc un code de 204, pas de
‫contenu, qui est la norme lors de
‫la suppression, mais maintenant si nous obtenons
‫toutes nos tournées, nous devrions maintenant voir un nombre huit
‫ici, donc seulement
‫huit résultats, et cela signifie que le dernier est maintenant parti, d'accord ?
‫Et donc maintenant, comme nous venons
‫de le prouver, un administrateur
‫a la permission de supprimer efficacement des visites, d'accord ?
‫Et, je ne saurais trop
‫insister sur l'importance de ce morceau de code ici.
‫Donc, en gros, où nous obtenons le rôle de
‫l'utilisateur actuel du middleware avant, d'accord ?
‫Donc, stocker l'utilisateur sur la demande comme nous l'avons
‫fait ici, est vraiment
‫crucial pour que cette prochaine étape fonctionne réellement, d'accord ?
‫Ainsi, l'ID qui est encodé dans le jeton Web Jason est ce
‫qui permet à notre code de
‫savoir si l'utilisateur qui essaie d'effectuer l'action est un utilisateur, ou s'il
‫s'agit d'un administrateur, ou s'il s'agit d'un guide principal, ou autre.
‫Encore une fois, parce que
‫ces données proviennent de ce middleware de protection.
‫Super.
‫C'était encore une autre pièce importante du puzzle dans
‫la mise en œuvre de notre flux de travail d'authentification ici.
‫Et bien sûr, vous souhaitez restreindre de nombreux
‫autres itinéraires, par exemple, comme la mise à jour ici, d'accord ?
‫Mais je vais laisser ça pour
‫un point ultérieur du cours, d'accord ?
‫Ici, je voulais juste vous
‫montrer comment tout cela fonctionne, d'accord ?
‫Donc, je pense que j'ai réussi.
‫J'espère que vous avez compris comment cela a fonctionné,
‫et bien sûr, sinon, vous pouvez toujours poser une question
‫dans la section officielle Q & A.
‫Quoi qu'il en soit, il y a du contenu plus intéressant à venir en ce moment
‫et donc, passons à autre chose.