62 lines
1.4 KiB
TypeScript
62 lines
1.4 KiB
TypeScript
import { Request, Response, NextFunction } from 'express';
|
|
import jwt from 'jsonwebtoken';
|
|
import { prisma } from '../index';
|
|
|
|
export interface AuthenticatedRequest extends Request {
|
|
user?: {
|
|
userId: number;
|
|
username: string;
|
|
};
|
|
}
|
|
|
|
export const authenticateToken = async (
|
|
req: AuthenticatedRequest,
|
|
res: Response,
|
|
next: NextFunction
|
|
) => {
|
|
const authHeader = req.headers['authorization'];
|
|
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
|
|
if (!token) {
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: 'Access token required',
|
|
});
|
|
}
|
|
|
|
try {
|
|
const jwtSecret = process.env['JWT_SECRET'];
|
|
if (!jwtSecret) {
|
|
return res.status(500).json({
|
|
success: false,
|
|
message: 'Server configuration error',
|
|
});
|
|
}
|
|
|
|
const decoded = jwt.verify(token, jwtSecret) as any;
|
|
|
|
// Verify user still exists
|
|
const user = await prisma.adminUser.findUnique({
|
|
where: { id: decoded.userId },
|
|
});
|
|
|
|
if (!user) {
|
|
return res.status(401).json({
|
|
success: false,
|
|
message: 'Invalid token - user not found',
|
|
});
|
|
}
|
|
|
|
req.user = {
|
|
userId: decoded.userId,
|
|
username: decoded.username,
|
|
};
|
|
|
|
next();
|
|
} catch (error) {
|
|
return res.status(403).json({
|
|
success: false,
|
|
message: 'Invalid or expired token',
|
|
});
|
|
}
|
|
};
|