Spaces:
Running
Running
import { Request, Response, NextFunction } from "express"; | |
import jwt from "jsonwebtoken"; | |
const JWT_SECRET = process.env.JWT_SECRET || "your-jwt-secret-key"; | |
export interface AuthRequest extends Request { | |
user?: { | |
id: string; | |
type: 'user' | 'seller' | 'admin'; | |
username: string; | |
}; | |
} | |
export const authenticateToken = async (req: AuthRequest, res: Response, next: NextFunction) => { | |
const authHeader = req.headers.authorization; | |
const token = authHeader && authHeader.split(' ')[1]; | |
if (!token) { | |
return res.status(401).json({ message: 'Access token required' }); | |
} | |
try { | |
const payload = jwt.verify(token, JWT_SECRET) as any; | |
req.user = payload; | |
next(); | |
} catch (error) { | |
return res.status(403).json({ message: 'Invalid or expired token' }); | |
} | |
}; | |
export const requireRole = (roles: Array<'user' | 'seller' | 'admin'>) => { | |
return (req: AuthRequest, res: Response, next: NextFunction) => { | |
if (!req.user || !roles.includes(req.user.type)) { | |
return res.status(403).json({ message: 'Insufficient permissions' }); | |
} | |
next(); | |
}; | |
}; | |
export const optionalAuth = async (req: AuthRequest, res: Response, next: NextFunction) => { | |
const authHeader = req.headers.authorization; | |
const token = authHeader && authHeader.split(' ')[1]; | |
if (token) { | |
try { | |
const payload = jwt.verify(token, JWT_SECRET) as any; | |
req.user = payload; | |
} catch (error) { | |
// Token invalid, but continue without user | |
} | |
} | |
next(); | |
}; | |
export const generateToken = (user: { id: string; type: 'user' | 'seller' | 'admin'; username: string }) => { | |
return jwt.sign(user, JWT_SECRET, { expiresIn: '24h' }); | |
}; | |