Implémentez le middleware d'authentification
Nous allons à présent créer le middleware qui va vérifier que l’utilisateur est bien connecté et transmettre les informations de connexion aux différentes méthodes qui vont gérer les requêtes.
Créez un dossier middleware
et un fichier auth.js
à l'intérieur :
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
const decodedToken = jwt.verify(token, 'RANDOM_TOKEN_SECRET');
const userId = decodedToken.userId;
req.auth = {
userId: userId
};
next();
} catch(error) {
res.status(401).json({ error });
}
};
Dans ce middleware :
Étant donné que de nombreux problèmes peuvent se produire, nous insérons tout à l'intérieur d'un bloc
try...catch
.Nous extrayons le token du header
Authorization
de la requête entrante. N'oubliez pas qu'il contiendra également le mot-cléBearer
. Nous utilisons donc la fonctionsplit
pour tout récupérer après l'espace dans le header. Les erreurs générées ici s'afficheront dans le bloccatch
.Nous utilisons ensuite la fonction
verify
pour décoder notre token. Si celui-ci n'est pas valide, une erreur sera générée.Nous extrayons l'ID utilisateur de notre token et le rajoutons à l’objet
Request
afin que nos différentes routes puissent l’exploiter.Dans le cas contraire, tout fonctionne et notre utilisateur est authentifié. Nous passons à l'exécution à l'aide de la fonction
next()
.
Maintenant, nous devons appliquer ce middleware à nos routes stuff
, qui sont celles à protéger. Dans notre routeur stuff
, nous importons notre middleware et le passons comme argument aux routes à protéger :
const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth');
const stuffCtrl = require('../controllers/stuff');
router.get('/', auth, stuffCtrl.getAllStuff);
router.post('/', auth, stuffCtrl.createThing);
router.get('/:id', auth, stuffCtrl.getOneThing);
router.put('/:id', auth, stuffCtrl.modifyThing);
router.delete('/:id', auth, stuffCtrl.deleteThing);
module.exports = router;
Désormais, à partir du front-end, vous devriez être capable de vous connecter et d'utiliser normalement l'application. Pour vérifier que les requêtes non autorisées ne fonctionnent pas, vous pouvez utiliser une application (telle que Postman) pour passer une demande sans en-tête Authorization
. L'API refusera l'accès et renverra une réponse 401.
Félicitations ! Votre API implémente à présent l'authentification par token et est correctement sécurisée.
En résumé
La méthode
verify()
du package jsonwebtoken permet de vérifier la validité d'un token (sur une requête entrante, par exemple).Ajoutez bien votre middleware d'authentification dans le bon ordre sur les bonnes routes.
Attention aux failles de sécurité !
Qu'avez-vous appris dans cette partie du cours ?
Vous avez ajouté un modèle de données User afin de stocker les informations utilisateur dans votre base de données.
Vous avez implémenté le cryptage de mot de passe sécurisé afin de stocker en toute sécurité les mots de passe utilisateur.
Vous avez créé et envoyé des tokens au front-end pour authentifier les requêtes.
Vous avez ajouté le middleware d'authentification pour sécuriser les routes dans votre API. De cette façon, seules les requêtes authentifiées seront gérées.
Dans la dernière partie de ce cours, vous en apprendrez plus sur la gestion des fichiers :
comment capturer les fichiers provenant du front-end ;
comment les enregistrer sur votre serveur ;
comment les supprimer lorsqu'ils ne sont plus nécessaires.