auth.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Request, Response, NextFunction } from 'express';
  2. import jwt from 'jsonwebtoken';
  3. export interface JwtPayload {
  4. userId: string;
  5. email: string;
  6. role: string;
  7. }
  8. declare global {
  9. namespace Express {
  10. interface Request {
  11. user?: JwtPayload;
  12. }
  13. }
  14. }
  15. export function authMiddleware(req: Request, res: Response, next: NextFunction): void {
  16. const authHeader = req.headers.authorization;
  17. const token =
  18. authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : req.cookies?.token;
  19. if (!token) {
  20. res.status(401).json({ error: 'No token provided' });
  21. return;
  22. }
  23. try {
  24. const secret = process.env.JWT_SECRET || 'fallback-secret';
  25. const payload = jwt.verify(token, secret) as JwtPayload;
  26. req.user = payload;
  27. next();
  28. } catch {
  29. res.status(401).json({ error: 'Invalid or expired token' });
  30. }
  31. }
  32. export function optionalAuth(req: Request, res: Response, next: NextFunction): void {
  33. const authHeader = req.headers.authorization;
  34. const token =
  35. authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : req.cookies?.token;
  36. if (token) {
  37. try {
  38. const secret = process.env.JWT_SECRET || 'fallback-secret';
  39. const payload = jwt.verify(token, secret) as JwtPayload;
  40. req.user = payload;
  41. } catch {
  42. // ignore invalid token for optional auth
  43. }
  44. }
  45. next();
  46. }