đ ActivitĂ© Pratique : Mise en Place dâun SystĂšme dâAuthentification BasĂ© sur des JWT
Dans cette activitĂ©, nous allons implĂ©menter un systĂšme dâauthentification utilisant des JSON Web Tokens (JWT) avec Node.js et Express. Ce systĂšme permettra aux utilisateurs de s'inscrire, de se connecter et d'accĂ©der Ă des routes protĂ©gĂ©es uniquement s'ils sont authentifiĂ©s via un JWT.
Objectif de l'activité
Nous allons construire une authentification JWT complÚte avec Node.js et Express : inscription, connexion, et protection de routes. Les utilisateurs accÚdent aux routes sécurisées uniquement s'ils présentent un JWT valide.
đ Ătapes Ă Suivre
đ 1. Initialisation du Projet
-
Créer un nouveau projet Node.js :
mkdir jwt-auth cd jwt-authnpm init -y npm install express bcrypt jsonwebtoken body-parser dotenv -
Configurer lâenvironnement :
Créez un fichier.envà la racine pour y stocker des variables sensibles :JWT_SECRET=votre_secret_jwt PORT=3000
đ 2. Structure des Fichiers
Organisez les fichiers comme suit :
jwt-auth/
âââ app.js
âââ .env
âââ package.jsonđ 3. Ăcriture du Code
Fichier app.js :
const express = require('express');
const bodyParser = require('body-parser');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
require('dotenv').config();
const app = express();
app.use(bodyParser.json());
// Simuler une base de données
const users = [];
// Middleware pour vérifier les JWT
function authenticateToken(req, res, next) {
const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];
if (!token) return res.status(401).send('AccÚs non autorisé : Aucun token fourni.');
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
if (err) return res.status(403).send('Token invalide.');
req.user = user;
next();
});
}
// Route d'inscription
app.post('/register', async (req, res) => {
const { username, password } = req.body;
if (!username || !password) return res.status(400).send('Nom dâutilisateur et mot de passe requis.');
// VĂ©rifier si l'utilisateur existe dĂ©jĂ
const existingUser = users.find(user => user.username === username);
if (existingUser) return res.status(400).send('Utilisateur déjà existant.');
// Hacher le mot de passe
const hashedPassword = await bcrypt.hash(password, 10);
users.push({ username, password: hashedPassword });
res.status(201).send('Utilisateur enregistré avec succÚs.');
});
// Route de connexion
app.post('/login', async (req, res) => {
const { username, password } = req.body;
const user = users.find(user => user.username === username);
if (!user) return res.status(400).send('Nom dâutilisateur ou mot de passe incorrect.');
// Vérifier le mot de passe
const isPasswordValid = await bcrypt.compare(password, user.password);
if (!isPasswordValid) return res.status(400).send('Nom dâutilisateur ou mot de passe incorrect.');
// Générer un JWT
const token = jwt.sign({ username: user.username }, process.env.JWT_SECRET, { expiresIn: '1h' });
res.json({ token });
});
// Route protégée
app.get('/protected', authenticateToken, (req, res) => {
res.send(`Bienvenue ${req.user.username}, vous ĂȘtes authentifiĂ©.`);
});
// Démarrer le serveur
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Serveur en cours dâexĂ©cution sur http://localhost:${PORT}`);
});đ 4. Tester lâApplication
-
Démarrer le serveur :
node app.js -
Inscription (POST /register) :
Utilisez Postman ou curl pour envoyer une requĂȘte :POST http://localhost:3000/register Content-Type: application/json { "username": "testuser", "password": "password123" }RĂ©ponse attendue :
Utilisateur enregistré avec succÚs. -
Connexion (POST /login) :
Envoyez une requĂȘte pour obtenir un token JWT :POST http://localhost:3000/login Content-Type: application/json { "username": "testuser", "password": "password123" }RĂ©ponse attendue :
{ "token": "<votre_jwt>" } -
Accéder à une route protégée (GET /protected) :
Ajoutez le token dans les headers de la requĂȘte :Authorization: Bearer <votre_jwt>RĂ©ponse attendue :
Bienvenue testuser, vous ĂȘtes authentifiĂ©. -
Tester un Token Invalide :
Remplacez le token par un faux ou un expiré, et observez la réponse401ou403.
đ Explications Techniques
-
bcrypt :
UtilisĂ© pour hacher et vĂ©rifier les mots de passe afin quâils ne soient jamais stockĂ©s en clair. -
jsonwebtoken :
jwt.signgénÚre un token avec un payload (données utilisateur).jwt.verifyvérifie si un token est valide et non expiré.
-
Middleware
authenticateToken:
ProtĂšge les routes sensibles en exigeant un JWT valide dans les headers. -
Expiration du Token :
Le token est configurĂ© pour expirer aprĂšs 1 heure (expiresIn: '1h'). Cela rĂ©duit le risque dâabus en cas de vol du token.
đ AmĂ©liorations Futures
- Ajouter une base de données réelle (MongoDB, MySQL) pour stocker les utilisateurs.
- Gérer la révocation de tokens via une liste noire.
- Chiffrer les données sensibles dans les payloads JWT si nécessaire.
- Utiliser
HttpOnlyetSecurepour transporter les JWT dans des cookies sécurisés.
Ce systÚme vous donne une base solide pour implémenter un mécanisme d'authentification moderne basé sur des JWT, adaptable aux APIs REST ou aux microservices.
Vérification rapide
Quiz du chapitre
Authentification
Terminez le quiz du chapitre pour le marquer comme complété.
Jetons JWT (JSON Web Tokens)
Les JSON Web Tokens sont une méthode moderne pour gérer l'authentification et la transmission sécurisée de données entre les parties d'une application web.
Exercice â Page de connexion et vĂ©rification IAM
Construisez une page de connexion minimale en distinguant identification, authentification et autorisation, avec un mot de passe haché cÎté serveur.