Intermédiaire45 min30 XP
Objectifs de cette leçon
- Comprendre le fonctionnement des JWT
- Créer et vérifier des tokens
- Protéger des routes avec JWT
Authentification : JWT et bcrypt 🔐
Les bases de l'authentification
L'authentification consiste à vérifier l'identité d'un utilisateur. Le flux typique :
- L'utilisateur s'inscrit (email + mot de passe)
- Le mot de passe est haché et stocké en base
- À la connexion, on vérifie le mot de passe
- On génère un token JWT pour les requêtes suivantes
Hacher les mots de passe avec bcrypt
npm install bcrypt
import bcrypt from 'bcrypt'; // Hacher un mot de passe const motDePasse = 'monSecret123'; const salt = await bcrypt.genSalt(10); const hash = await bcrypt.hash(motDePasse, salt); console.log(hash); // "$2b$10$..." // Vérifier un mot de passe const estValide = await bcrypt.compare('monSecret123', hash); console.log(estValide); // true const estFaux = await bcrypt.compare('mauvais', hash); console.log(estFaux); // false
💡 Ne JAMAIS stocker les mots de passe en clair.
bcryptles hache avec un algorithme unidirectionnel.
Générer des tokens JWT
npm install jsonwebtoken
import jwt from 'jsonwebtoken'; const SECRET = process.env.JWT_SECRET || 'ma-cle-secrete'; // Générer un token const token = jwt.sign( { userId: '123', role: 'admin' }, SECRET, { expiresIn: '24h' } ); console.log(token); // "eyJhbGciOiJIUzI1NiIs..." // Vérifier un token const decoded = jwt.verify(token, SECRET); console.log(decoded); // { userId: '123', role: 'admin', iat: ..., exp: ... }
Middleware d'authentification
import jwt from 'jsonwebtoken'; export function authMiddleware(req, res, next) { const header = req.headers.authorization; if (!header || !header.startsWith('Bearer ')) { return res.status(401).json({ error: 'Token manquant' }); } const token = header.split(' ')[1]; try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (err) { return res.status(401).json({ error: 'Token invalide' }); } }
Routes d'inscription et connexion
import { Router } from 'express'; import bcrypt from 'bcrypt'; import jwt from 'jsonwebtoken'; const router = Router(); const SECRET = process.env.JWT_SECRET; // POST /api/auth/register router.post('/register', async (req, res) => { const { email, motDePasse } = req.body; const hash = await bcrypt.hash(motDePasse, 10); const user = { id: Date.now().toString(), email, hash }; res.status(201).json({ message: 'Compte créé', userId: user.id }); }); // POST /api/auth/login router.post('/login', async (req, res) => { const { email, motDePasse } = req.body; const user = { id: '1', email, hash: '$2b$10$...' }; if (!user) return res.status(401).json({ error: 'Identifiants incorrects' }); const estValide = await bcrypt.compare(motDePasse, user.hash); if (!estValide) return res.status(401).json({ error: 'Identifiants incorrects' }); const token = jwt.sign({ userId: user.id }, SECRET, { expiresIn: '24h' }); res.json({ token }); }); export default router;
Utilisation dans les routes protégées
import { authMiddleware } from './middleware/auth.js'; router.get('/profile', authMiddleware, (req, res) => { res.json({ message: `Bienvenue user ${req.user.userId}` }); });
Résumé
| Concept | Outil | Rôle |
|---|---|---|
| Hachage | bcrypt | Protéger les mots de passe |
| Token | jsonwebtoken | Authentifier les requêtes |
| Middleware | authMiddleware | Vérifier le token |
| Payload | { userId, role } | Données stockées dans le token |
Exercices 🎯
- Implémente un système complet inscription/connexion avec Prisma et bcrypt
- Ajoute un endpoint
GET /profilequi retourne les infos de l'utilisateur connecté - Implémente un système de rôles (admin/user) avec un middleware
requireRole('admin')
⚡ Simulateur — Authentification
Étape 1/4📝 Pseudo-code
1const jwt = require("jsonwebtoken");
2const token = jwt.sign({ id: 1 }, "secret");
3const decoded = jwt.verify(token, "secret");
4console.log(decoded);
⚙️ Exécution
📦 Mémoire
Aucune variable
🔀 Flux d'exécution
require("jsonwebtoken")
3
Import de JWT
require("jsonwebtoken") importe la bibliothèque JSON Web Token pour créer et vérifier des tokens.