Files

77 lines
1.7 KiB
JavaScript
Raw Permalink Normal View History

/**
* JWT认证中间件
*/
const jwt = require('jsonwebtoken');
const JWT_SECRET = process.env.JWT_SECRET || 'duoduo-career-jwt-secret-key-2024';
/**
* 验证JWT Token
*/
const verifyToken = (req, res, next) => {
try {
// 从请求头获取token
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({
success: false,
message: '未提供认证令牌'
});
}
// 验证token
const decoded = jwt.verify(token, JWT_SECRET);
req.user = decoded;
next();
} catch (error) {
if (error.name === 'TokenExpiredError') {
return res.status(401).json({
success: false,
message: '令牌已过期,请重新登录'
});
}
return res.status(401).json({
success: false,
message: '无效的认证令牌'
});
}
};
/**
* 验证管理员权限
*/
const verifyAdmin = (req, res, next) => {
if (req.user.role !== 'admin') {
return res.status(403).json({
success: false,
message: '需要管理员权限'
});
}
next();
};
/**
* 可选的Token验证用于获取登录状态但不强制要求
*/
const optionalAuth = (req, res, next) => {
try {
const token = req.headers.authorization?.replace('Bearer ', '');
if (token) {
const decoded = jwt.verify(token, JWT_SECRET);
req.user = decoded;
}
} catch (error) {
// 忽略错误,继续执行
}
next();
};
module.exports = {
verifyToken,
verifyAdmin,
optionalAuth
};