Autorisation et authentification en JavaScript (Node.js)
Dans le développement web moderne, la sécurité des données utilisateur est une priorité. Dans ce guide, nous allons explorer les concepts clés de l'authentification (vérification d'identité) et de l'autorisation (gestion des accès) dans l'environnement Node.js. Vous apprendrez à implémenter l'inscription, la connexion par mot de passe, l'utilisation des jetons JWT et la protection des routes.
1. Concepts de base
- Authentification — processus de vérification de l'identité (par exemple, email+mot de passe).
- Autorisation — vérification des droits d'un utilisateur à effectuer une action (rôle admin/user).
- JWT (JSON Web Token) — méthode compacte de transmission de données sous forme de jeton, souvent utilisée pour les sessions.
- Hachage des mots de passe — exigence de sécurité obligatoire (bcrypt, argon2).
2. Installation des dépendances
Pour travailler, nous aurons besoin des paquets npm suivants :
npm install express bcryptjs jsonwebtoken dotenvexpress— framework webbcryptjs— hachage des mots de passejsonwebtoken— création et vérification des JWTdotenv— gestion des clés secrètes
3. Inscription simple et hachage du mot de passe
Créons un modèle utilisateur de base (pour l'exemple, nous utilisons un tableau en mémoire ; dans un projet réel, remplacez-le par une base de données) :
const bcrypt = require('bcryptjs');const users = []; // simulation de BDD
async function registerUser(email, password) { const salt = await bcrypt.genSalt(10); const hashedPassword = await bcrypt.hash(password, salt); users.push({ email, password: hashedPassword }); console.log('Utilisateur inscrit :', email);}
// Exemple d'appel :registerUser('user@example.com', 'myPassword123');4. Authentification avec JWT
Après une connexion réussie, nous délivrons au client un jeton JWT. Le jeton contient l'ID de l'utilisateur et une date d'expiration.
const jwt = require('jsonwebtoken');require('dotenv').config();
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
function loginUser(email, password) { const user = users.find(u => u.email === email); if (!user) return null;
const isValid = bcrypt.compareSync(password, user.password); if (!isValid) return null;
// Création du jeton const token = jwt.sign( { userId: user.email, role: 'user' }, JWT_SECRET, { expiresIn: '1h' } ); return token;}5. Middleware pour la protection des routes
Créons un middleware qui vérifie le JWT dans l'en-tête Authorization :
function authMiddleware(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
if (!token) { return res.status(401).json({ message: 'Jeton non fourni' }); }
try { const decoded = jwt.verify(token, JWT_SECRET); req.user = decoded; // transmission des données utilisateur à la requête next(); } catch (err) { return res.status(403).json({ message: 'Jeton invalide' }); }}6. Exemple d'utilisation dans Express
Assemblons le tout — créons des routes pour la connexion et un profil protégé :
const express = require('express');const app = express();app.use(express.json());
// Route de connexionapp.post('/api/login', (req, res) => { const { email, password } = req.body; const token = loginUser(email, password); if (!token) { return res.status(401).json({ message: 'Identifiants incorrects' }); } res.json({ token });});
// Route protégéeapp.get('/api/profile', authMiddleware, (req, res) => { res.json({ message: 'Accès