first commit
This commit is contained in:
91
api/middleware/auth.ts
Executable file
91
api/middleware/auth.ts
Executable file
@@ -0,0 +1,91 @@
|
||||
/**
|
||||
* JWT认证中间件
|
||||
*/
|
||||
import { type Request, type Response, type NextFunction } from 'express';
|
||||
import jwt from 'jsonwebtoken';
|
||||
|
||||
// JWT密钥
|
||||
const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
|
||||
|
||||
// 扩展Request接口以包含用户信息
|
||||
declare global {
|
||||
namespace Express {
|
||||
interface Request {
|
||||
user?: {
|
||||
id: number;
|
||||
username: string;
|
||||
email: string;
|
||||
role: string;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* JWT认证中间件
|
||||
*/
|
||||
export function authenticateToken(req: Request, res: Response, next: NextFunction): void {
|
||||
console.log('认证中间件开始,请求路径:', req.path);
|
||||
const authHeader = req.headers['authorization'];
|
||||
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
||||
console.log('认证头:', authHeader ? '存在' : '不存在');
|
||||
|
||||
if (!token) {
|
||||
console.log('错误: 访问令牌缺失');
|
||||
res.status(401).json({
|
||||
success: false,
|
||||
message: '访问令牌缺失'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
console.log('开始验证JWT token');
|
||||
const decoded = jwt.verify(token, JWT_SECRET) as any;
|
||||
req.user = {
|
||||
id: decoded.id,
|
||||
username: decoded.username,
|
||||
email: decoded.email,
|
||||
role: decoded.role
|
||||
};
|
||||
console.log('JWT验证成功,用户信息:', req.user);
|
||||
console.log('认证中间件完成,调用next()');
|
||||
next();
|
||||
} catch (error) {
|
||||
console.log('JWT验证失败:', error);
|
||||
res.status(403).json({
|
||||
success: false,
|
||||
message: '访问令牌无效或已过期'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 可选认证中间件(不强制要求token)
|
||||
*/
|
||||
export function optionalAuth(req: Request, res: Response, next: NextFunction): void {
|
||||
const authHeader = req.headers['authorization'];
|
||||
const token = authHeader && authHeader.split(' ')[1];
|
||||
|
||||
if (token) {
|
||||
try {
|
||||
const decoded = jwt.verify(token, JWT_SECRET) as any;
|
||||
req.user = {
|
||||
id: decoded.id,
|
||||
username: decoded.username,
|
||||
email: decoded.email,
|
||||
role: decoded.role
|
||||
};
|
||||
} catch (error) {
|
||||
// 忽略token验证错误,继续处理请求
|
||||
console.warn('可选认证token验证失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
next();
|
||||
}
|
||||
|
||||
export default {
|
||||
authenticateToken,
|
||||
optionalAuth
|
||||
};
|
||||
Reference in New Issue
Block a user