const jwt = require('jsonwebtoken'); const { getDB } = require('../database'); const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key'; // 在生产环境中应该使用环境变量 /** * 用户认证中间件 * 验证JWT令牌并检查用户状态(包括是否被拉黑) */ const auth = async (req, res, next) => { try { const token = req.header('Authorization')?.replace('Bearer ', ''); if (!token) { return res.status(401).json({ success: false, message: '未提供认证令牌' }); } const decoded = jwt.verify(token, JWT_SECRET); const db = getDB(); const [users] = await db.execute('SELECT * FROM users WHERE id = ?', [decoded.userId]); if (users.length === 0) { return res.status(401).json({ success: false, message: '用户不存在' }); } const user = users[0]; // 检查用户是否被拉黑 if (user.is_blacklisted) { return res.status(403).json({ success: false, message: '账户已被拉黑,请联系管理员', code: 'USER_BLACKLISTED' }); } // 检查支付状态(管理员除外) if (user.role !== 'admin' && user.payment_status === 'unpaid') { console.log(11111); return res.status(403).json({ success: false, message: '您的账户尚未激活,请完成支付后再使用', code: 'PAYMENT_REQUIRED', needPayment: true, userId: user.id }); } req.user = user; next(); } catch (error) { res.status(401).json({ success: false, message: '无效的认证令牌' }); } }; // 管理员认证中间件 const adminAuth = (req, res, next) => { if (req.user.role !== 'admin') { return res.status(403).json({ success: false, message: '需要管理员权限' }); } next(); }; /** * 支付认证中间件 * 只验证JWT令牌和用户状态,不检查支付状态 * 用于支付相关接口,允许未支付用户创建支付订单 */ const paymentAuth = async (req, res, next) => { try { const token = req.header('Authorization')?.replace('Bearer ', ''); if (!token) { return res.status(401).json({ success: false, message: '未提供认证令牌' }); } const decoded = jwt.verify(token, JWT_SECRET); const db = getDB(); const [users] = await db.execute('SELECT * FROM users WHERE id = ?', [decoded.userId]); if (users.length === 0) { return res.status(401).json({ success: false, message: '用户不存在' }); } const user = users[0]; // 检查用户是否被拉黑 if (user.is_blacklisted) { return res.status(403).json({ success: false, message: '账户已被拉黑,请联系管理员', code: 'USER_BLACKLISTED' }); } // 注意:这里不检查支付状态,允许未支付用户创建支付订单 req.user = user; next(); } catch (error) { console.error('支付认证失败:', error); if (error.name === 'JsonWebTokenError') { return res.status(401).json({ success: false, message: '无效的认证令牌' }); } if (error.name === 'TokenExpiredError') { return res.status(401).json({ success: false, message: '认证令牌已过期' }); } return res.status(500).json({ success: false, message: '认证失败' }); } }; module.exports = { auth, adminAuth, paymentAuth, JWT_SECRET };