Académique Documents
Professionnel Documents
Culture Documents
Il est techniquement possible de conserver toute notre logique dans le fichier server.js, mais
ce fichier peut vite devenir bien trop volumineux, ce qui compliquerait la gestion. Par
conséquent, rendons les choses un peu plus modulaires.
- Configuration de routage
o Sous le dossier 'server', créer un dossier 'routes', puis dans ce nouveau
dossier créer le fichier 'departRoutes.js' incluant le code suivant :
module.exports = router;
o Couper toutes les routes de server.js et les coller dans ce nouveau fichier.
o Veiller alors à remplacer toutes les occurrences de app par router.
o Importer ce nouveau module au niveau de server.js pour pouvoir utiliser les routes
o Re-exécuter le programme pour vérifier le bon fonctionnement.
- Configuration de la connexion
o Sous le dossier ‘server’, créer un dossier ‘configuration’, puis dans ce
nouveau dossier le fichier ‘connexionMongo.js’ incluant le code permettant
de se connecter à l’url de la base de données mongoDB.
o Importer ce fichier au niveau de server.js et vérifier le bon fonctionnement de
l’application.
JWT pour JSON Web Token est une méthode sécurisée d’échange d’informations, décrite par
la RFC 7519. L’information est échangée sous la forme d’un jeton signé afin de pouvoir en
vérifier la légitimité. Ce jeton est compact et peut être inclus dans une URL sans poser de
problème.
JWT est couramment utilisé pour implémenter des mécanismes d’authentification stateless
pour des SPA (Single Page Application) ou pour des application mobiles.
Un JWT est composé de trois parties, chacune contenant des informations différentes :
un header : identifie quel algorithme a été utilisé pour générer la signature
un payload : la partie du token qui contient les informations que l’on souhaite transmettre
la signature : créée à partir du header et du payload générés et d’un secret
Exemple (https://jwt.io/) :
Pour s'assurer que deux utilisateurs ne puissent pas utiliser la même adresse e-
mail, nous utiliserons le mot clé unique pour l'attribut email du schéma
d'utilisateur.
Les erreurs générées par défaut par MongoDB pouvant être difficiles à résoudre, il est alors
préférable d’installer un package de validation pour prévalider les informations avant de les
enregistrer :
userSchema.plugin(uniqueValidator);
};
};
o Afin d’implémenter les routes, créer un autre fichier 'userRoutes.js', cette fois
dans le dossier 'routes' :
router.post('/users/signup', userCtrl.signup);
router.post('/users/login', userCtrl.login);
module.exports = router;
Il nous faudra le package de chiffrement bcrypt pour la fonction signup. Installons-le donc
dans le projet :
> npm install bcrypt
Nous ferons recours par la suite à la fonction de hachage de bcrypt : bcrypt.hash permettant
de générer le hash appliqué sur le mot de passe.
Nous pouvons l'importer dans le contrôleur afin d’implémenter la fonction signup qui
permettra de créer un utilisateur et l'enregistrer dans la base de données, en renvoyant une
réponse de réussite en cas de succès, et des erreurs avec le code d'erreur en cas d'échec :
Maintenant que nous pouvons créer des utilisateurs dans la base de données, il nous faut
une méthode permettant de vérifier si un utilisateur qui tente de se connecter dispose
d'identifiants valides. Au niveau de cette fonction :
Pour pouvoir créer et vérifier les tokens d'authentification, il nous faudra un nouveau
package :
Nous l'importerons ensuite dans le contrôleur utilisateur afin de pouvoir l’utiliser dans la
fonction login qu’on va mettre à jour de sorte à :
Utiliser l'onglet « Réseau » de Chrome DevTools pour vérifier qu’une fois connecté,
chaque requête provenant du front-end contient bien le token !
Dans ce middleware :
- récupérer le token du header Authorization de la requête entrante.
- utiliser ensuite la fonction verify pour décoder le token. Si celui-ci n'est pas valide,
une erreur sera générée
- récupérer l'ID utilisateur du token ;
o si la demande contient un ID utilisateur, nous le comparons à celui extrait
du token. S'ils sont différents, nous générons une erreur ;
o dans le cas contraire, tout fonctionne et notre utilisateur est authentifié. nous
passons l'exécution du middleware suivant à l'aide de la fonction next() .
Maintenant, nous devons appliquer ce middleware à toutes les routes relatives à notre
module département.
Au niveau du routeur departRoutes.js, nous importons alors notre middleware et le passons
comme argument aux routes à protéger :
- Utiliser une application (telle que postman) afin de vérifier que les requêtes non
autorisées ne fonctionnent pas.
Vous pouvez passer, à titre d’exemple une demande sans en-tête Authorization. L'API
refusera l'accès et renverra une réponse 401.