Files
yunhaifinance/backend/middleware/auth.js
T

82 lines
1.7 KiB
JavaScript

const jwt = require('jsonwebtoken');
const { hashPassword, verifyPassword, verifyToken } = require('../utils/auth');
const JWT_SECRET = process.env.JWT_SECRET || 'your-jwt-secret-change-in-production';
const generateToken = (user) => {
const payload = {
id: user.id,
username: user.username,
role: user.role
};
return jwt.sign(payload, JWT_SECRET, { expiresIn: '24h' });
};
const authenticate = (req, res, next) => {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ success: false, message: '未提供认证令牌' });
}
const decoded = verifyToken(token);
if (!decoded) {
return res.status(401).json({ success: false, message: '无效的认证令牌' });
}
req.user = decoded;
next();
};
const optionalAuth = (req, res, next) => {
const token = req.headers.authorization?.replace('Bearer ', '');
if (!token) {
req.user = null;
next();
return;
}
const decoded = verifyToken(token);
if (!decoded) {
req.user = null;
next();
return;
}
req.user = decoded;
next();
};
const requireRole = (roles) => {
return (req, res, next) => {
if (!req.user) {
return res.status(401).json({ success: false, message: '未授权' });
}
if (!roles.includes(req.user.role)) {
return res.status(403).json({ success: false, message: '权限不足' });
}
next();
};
};
const requireAdmin = (req, res, next) => {
return requireRole(['admin'])(req, res, next);
};
module.exports = {
authenticate,
optionalAuth,
requireRole,
requireAdmin,
generateToken,
verifyToken,
hashPassword,
verifyPassword
};