Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 1x 48x 43x 5x 5x 5x 48x 48x 5x 43x 43x 43x 43x 1x | /**
* Middleware d'authentification — Vérifie le JWT et injecte req.user.
*
* Accepte le token JWT depuis :
* 1. Le cookie httpOnly "access_token" (méthode principale, sécurisée)
* 2. Le header Authorization: Bearer <token> (fallback pour WebSocket handshake)
*
* En cas de succès, injecte req.user = { id, email, plan }.
*
* @module middleware/auth
*/
const jwt = require('jsonwebtoken');
/**
* Extrait le JWT depuis le cookie ou le header Authorization.
* Le cookie est prioritaire car c'est la méthode la plus sûre.
*
* @param {import('express').Request} req
* @returns {string|null} — Le token JWT ou null si absent
*/
function extractToken(req) {
// 1. Cookie httpOnly (méthode principale)
if (req.cookies?.access_token) {
return req.cookies.access_token;
}
// 2. Header Authorization (fallback)
const authHeader = req.headers['authorization'];
Iif (authHeader?.startsWith('Bearer ')) {
return authHeader.slice(7);
}
return null;
}
/**
* Middleware Express — vérifie le JWT et injecte req.user.
* Retourne 401 si le token est absent, expiré ou invalide.
*/
function requireAuth(req, res, next) {
const token = extractToken(req);
if (!token) {
return res.status(401).json({ error: 'Token manquant.' });
}
try {
const payload = jwt.verify(token, process.env.JWT_SECRET);
req.user = { id: payload.sub, email: payload.email, plan: payload.plan };
next();
} catch (err) {
if (err.name === 'TokenExpiredError') {
return res.status(401).json({ error: 'Token expiré.', code: 'TOKEN_EXPIRED' });
}
return res.status(401).json({ error: 'Token invalide.' });
}
}
module.exports = { requireAuth, extractToken };
|