const jwt = require('jsonwebtoken'); const asyncHandler = require('../utils/asyncHandler'); const ErrorResponse = require('../utils/errorResponse'); const User = require('../models/User'); exports.protect = asyncHandler(async (req, res, next) => { let token; // 1. Check Authorization Header if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) { token = req.headers.authorization.split(' ')[1]; } // 2. Check Cookies else if (req.cookies && req.cookies.token) { token = req.cookies.token; } if (!token) { console.log(`AUTH_FAILURE: No token found in request to ${req.path}`); return next(new ErrorResponse('Not authorized: Neural token missing', 401)); } console.log(`[DEBUG_AUTH] Verifying token: ${token.substring(0, 10)}... (Length: ${token.length})`); try { const decoded = jwt.verify(token, process.env.JWT_SECRET || 'secret'); req.user = await User.findById(decoded.id); if (!req.user) { res.clearCookie('token'); return next(new ErrorResponse('Not authorized: Subject not found in archive. Please log in again.', 401)); } next(); } catch (err) { console.log(`AUTH_FAILURE: Token verification failed (${err.message})`); res.clearCookie('token'); return next(new ErrorResponse('Not authorized: Link signature invalid', 401)); } }); exports.authorize = (...roles) => { return (req, res, next) => { if (!roles.includes(req.user.role)) { return next(new ErrorResponse(`Rank ${req.user.role} unauthorized for this sector`, 403)); } next(); }; };