Autorisation et authentification en JavaScript (Node.js)
Dans le développement web moderne avec Node.js, la sécurité des données utilisateur et le contrôle d'accès sont des tâches cruciales. L'authentification (vérification de l'identité) et l'autorisation (vérification des droits) sont les deux piliers de tout système sécurisé. Dans cet article, nous allons examiner les outils et bibliothèques clés pour implémenter ces mécanismes sur la plateforme Node.js.
Concepts de base
Authentification — processus de vérification que l'utilisateur est bien celui qu'il prétend être (généralement via identifiant/mot de passe, jetons ou biométrie). Autorisation — détermination des actions et ressources accessibles à un utilisateur authentifié (rôles, droits d'accès).
Bibliothèques populaires pour Node.js
1. Passport.js — stratégie d'authentification universelle
Passport.js est la bibliothèque middleware la plus populaire pour Express. Elle prend en charge plus de 500 stratégies : locale (identifiant/mot de passe), OAuth2 (Google, Facebook, GitHub), JWT et bien d'autres.
const passport = require('passport');const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy( function(username, password, done) { User.findOne({ username: username }, function (err, user) { if (err) { return done(err); } if (!user) { return done(null, false, { message: 'Nom d\'utilisateur incorrect' }); } if (!user.validPassword(password)) { return done(null, false, { message: 'Mot de passe incorrect' }); } return done(null, user); }); }));
// Sérialisation et désérialisation de l'utilisateurpassport.serializeUser(function(user, done) { done(null, user.id);});
passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); });});2. JSON Web Tokens (JWT) — authentification sans session
La bibliothèque jsonwebtoken permet de créer et vérifier des jetons JWT. C'est idéal pour les API REST et les applications SPA.
const jwt = require('jsonwebtoken');const secretKey = process.env.JWT_SECRET;
// Création du jeton lors de la connexionconst token = jwt.sign( { userId: user.id, role: user.role }, secretKey, { expiresIn: '24h' });
// Middleware pour vérifier le jetonfunction authMiddleware(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
if (!token) return res.status(401).json({ error: 'Jeton non fourni' });
jwt.verify(token, secretKey, (err, decoded) => { if (err) return res.status(403).json({ error: 'Jeton invalide' }); req.user = decoded; next(); });}3. bcrypt — hachage sécurisé des mots de passe
Ne stockez jamais les mots de passe en clair ! bcrypt est la référence en matière de hachage avec sel.
const bcrypt = require('bcrypt');const saltRounds = 10;
// Hachage du mot de passe lors de l'inscriptionasync function hashPassword(plainPassword) { const salt = await bcrypt.genSalt(saltRounds); const hash = await bcrypt.hash(plainPassword, salt); return hash;}
// Vérification du mot de passe lors de la connexionasync function checkPassword(plainPassword, hash) { return await bcrypt.compare(plainPassword, hash);}4. express-session + connect-redis — gestion des sessions
Pour les applications web traditionnelles avec sessions côté serveur, utilisez express-session avec Redis pour la mise à l'échelle.
const session = require('express-session');const RedisStore = require('connect-redis')(session);
app.use(session({ store: new RedisStore({ client: redisClient }), secret: process.env.SESSION_SECRET, resave: false, saveUninitialized: false, cookie: { secure: process.env.NODE_ENV === 'production', // HTTPS httpOnly: true, maxAge: 24 * 60 * 60 * 1000 // 1 jour }})) Aussi dans la bibliothèque
Surveillance des applications .NET avec Prometheus et OpenTelemetry
Tests en C++ : aperçu des frameworks et outils (Google Test, Catch2, doctest)
Travailler avec Excel en TypeScript : bibliothèques, exemples et outils
Swagger/OpenAPI pour C# (.NET) : Génération et documentation d'API