const jwt = require('jsonwebtoken'); const User = require('../models/User'); const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key-change-in-production'; const authenticateToken = async (req, res, next) => { try { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (!token) { return res.status(401).json({ message: 'Access token required' }); } const decoded = jwt.verify(token, JWT_SECRET); // Get user from database to ensure they still exist and are active const user = await User.findByPk(decoded.id); if (!user || !user.isActive) { return res.status(403).json({ message: 'User not found or inactive' }); } req.user = { id: user.id, email: user.email, name: user.name, role: user.preferences?.role || 'user', allowedAgents: user.preferences?.allowedAgents || null }; next(); } catch (error) { if (error.name === 'TokenExpiredError') { return res.status(403).json({ message: 'Token expired' }); } if (error.name === 'JsonWebTokenError') { return res.status(403).json({ message: 'Invalid token' }); } return res.status(500).json({ message: 'Token verification failed' }); } }; const requireAdmin = (req, res, next) => { if (!req.user || req.user.role !== 'admin') { return res.status(403).json({ message: 'Admin privileges required' }); } next(); }; const generateToken = (user) => { return jwt.sign( { id: user.id, email: user.email, role: user.preferences?.role || 'user' }, JWT_SECRET, { expiresIn: '24h' } ); }; module.exports = { authenticateToken, requireAdmin, generateToken, JWT_SECRET };