All files / src/middleware auth.js

77.77% Statements 14/18
62.5% Branches 5/8
100% Functions 2/2
77.77% Lines 14/18

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 };