110 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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') {
 | ||
|       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 }; |