2026-05-10 13:12:44 +08:00

45 lines
1.2 KiB
TypeScript

import { Request, Response, NextFunction } from 'express';
import jwt from 'jsonwebtoken';
import { User } from '../models/userModel';
const JWT_SECRET = process.env.JWT_SECRET || 'writing-platform-dev-secret-change-in-production';
export interface AuthRequest extends Request {
user?: User;
}
export function generateToken(user: User): string {
return jwt.sign(
{
id: user.id,
phone: user.phone,
nickname: user.nickname,
role: user.role,
aiCompanion: user.aiCompanion,
},
JWT_SECRET,
{ expiresIn: '7d' }
);
}
export function verifyToken(token: string): User {
return jwt.verify(token, JWT_SECRET) as User;
}
export function authMiddleware(req: AuthRequest, res: Response, next: NextFunction): void {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
res.status(401).json({ error: true, code: 'UNAUTHORIZED', message: '未提供认证令牌' });
return;
}
const token = authHeader.slice(7);
try {
const user = verifyToken(token);
req.user = user;
next();
} catch {
res.status(401).json({ error: true, code: 'TOKEN_INVALID', message: '认证令牌无效或已过期' });
}
}