45 lines
1.2 KiB
TypeScript
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: '认证令牌无效或已过期' });
|
|
}
|
|
}
|