@@ -2,6 +2,8 @@ import jwt from 'jsonwebtoken';
22import HttpException from '../utils/exceptions/http.exception.js' ;
33import User from '../models/user.model.js' ;
44
5+ const JWT_ALGO = process . env . JWT_ALGO || 'HS256' ;
6+
57/**
68 * JWT Authentication Middleware
79 * Verifies JWT token, checks tokenVersion and user state, sets req.user
@@ -23,7 +25,7 @@ const authenticateToken = async (req, res, next) => {
2325
2426 let decoded ;
2527 try {
26- decoded = jwt . verify ( token , secret ) ;
28+ decoded = jwt . verify ( token , secret , { algorithms : [ JWT_ALGO ] } ) ;
2729 } catch ( err ) {
2830 if ( err . name === 'TokenExpiredError' ) {
2931 return next ( new HttpException ( 401 , 'Token expired. Please login again.' ) ) ;
@@ -42,12 +44,14 @@ const authenticateToken = async (req, res, next) => {
4244 return next ( new HttpException ( 401 , 'Invalid token: user not found or inactive' ) ) ;
4345 }
4446
45- const tokenVersion = decoded . tokenVersion || 0 ;
47+ const tokenVersion = Number ( decoded . tokenVersion || 0 ) ;
4648 if ( ( user . tokenVersion || 0 ) !== tokenVersion ) {
4749 return next ( new HttpException ( 401 , 'Token revoked. Please login again.' ) ) ;
4850 }
4951
50- req . user = decoded ;
52+ // normalize req.user for downstream handlers
53+ req . user = { userId, tokenVersion, ...decoded } ;
54+
5155 return next ( ) ;
5256 } catch ( error ) {
5357 console . error ( 'Auth middleware error:' , error ) ;
@@ -76,7 +80,7 @@ const optionalAuth = async (req, res, next) => {
7680 }
7781
7882 try {
79- const decoded = jwt . verify ( token , secret ) ;
83+ const decoded = jwt . verify ( token , secret , { algorithms : [ JWT_ALGO ] } ) ;
8084 const userId = decoded . userId || decoded . id || decoded . sub ;
8185 if ( ! userId ) {
8286 req . user = null ;
@@ -87,13 +91,12 @@ const optionalAuth = async (req, res, next) => {
8791 req . user = null ;
8892 return next ( ) ;
8993 }
90- if ( ( user . tokenVersion || 0 ) !== ( decoded . tokenVersion || 0 ) ) {
94+ if ( ( user . tokenVersion || 0 ) !== ( Number ( decoded . tokenVersion ) || 0 ) ) {
9195 req . user = null ;
9296 return next ( ) ;
9397 }
94- req . user = decoded ;
98+ req . user = { userId , tokenVersion : Number ( decoded . tokenVersion || 0 ) , ... decoded } ;
9599 } catch {
96- // invalid or expired token -> treat as unauthenticated
97100 req . user = null ;
98101 }
99102 return next ( ) ;
0 commit comments