@@ -162,21 +162,26 @@ export const loginUser = async (req, res, next) => {
162162 try {
163163 const user = await findUserByUsername ( username ) ;
164164 if ( ! user ) {
165- return res . status ( 401 ) . json ( { status : "error" , message : "Invalid credentials" } ) ;
165+ return res . status ( 401 ) . json ( { status : "error" , message : "Invalid credentials. " } ) ;
166166 }
167167
168168 if ( user . role === "vendor" && user . status === "Pending" ) {
169- return res . status ( 403 ) . json ( { status : "error" , message : "Your account is pending approval by an admin." } ) ;
169+ return res . status ( 403 ) . json ( { status : "error" , message : "Your account is pending admin approval ." } ) ;
170170 }
171171
172172 const isPasswordValid = await bcrypt . compare ( password , user . password ) ;
173173 if ( ! isPasswordValid ) {
174- return res . status ( 401 ) . json ( { status : "error" , message : "Invalid credentials" } ) ;
174+ return res . status ( 401 ) . json ( { status : "error" , message : "Invalid credentials. " } ) ;
175175 }
176176
177- // Generate 6-digit 2FA code
177+ // Generate a temporary 6-digit 2FA code
178178 const code = Math . floor ( 100000 + Math . random ( ) * 900000 ) . toString ( ) ;
179- pending2FA . set ( user . username , { code, expires : Date . now ( ) + 5 * 60 * 1000 } ) ; // 5 mins expiry
179+
180+ // Save code with expiry (5 minutes)
181+ pending2FA . set ( user . username , {
182+ code,
183+ expires : Date . now ( ) + 5 * 60 * 1000 ,
184+ } ) ;
180185
181186 await send2FACode ( user . email , code ) ;
182187
@@ -186,7 +191,7 @@ export const loginUser = async (req, res, next) => {
186191 username : user . username ,
187192 } ) ;
188193 } catch ( error ) {
189- handleError ( error , next , "Login error" ) ;
194+ return handleError ( error , next , "Login error" ) ;
190195 }
191196} ;
192197
@@ -197,19 +202,30 @@ export const verify2FA = async (req, res, next) => {
197202 try {
198203 const user = await findUserByUsername ( username ) ;
199204 if ( ! user ) {
200- return res . status ( 401 ) . json ( { status : "error" , message : "Invalid username" } ) ;
205+ return res . status ( 401 ) . json ( { status : "error" , message : "Invalid username. " } ) ;
201206 }
202207
203208 const record = pending2FA . get ( username ) ;
204- if ( ! record || record . code !== code || Date . now ( ) > record . expires ) {
205- return res . status ( 401 ) . json ( { status : "error" , message : "Invalid or expired 2FA code" } ) ;
209+
210+ if ( ! record ) {
211+ return res . status ( 401 ) . json ( { status : "error" , message : "No 2FA request found. Please login again." } ) ;
212+ }
213+
214+ if ( record . code !== code ) {
215+ return res . status ( 401 ) . json ( { status : "error" , message : "Invalid 2FA code." } ) ;
216+ }
217+
218+ if ( Date . now ( ) > record . expires ) {
219+ pending2FA . delete ( username ) ;
220+ return res . status ( 401 ) . json ( { status : "error" , message : "2FA code has expired." } ) ;
206221 }
207222
208223 pending2FA . delete ( username ) ;
209224
210225 const accessToken = TokenService . generateAccessToken ( user ) ;
211226 const refreshToken = TokenService . generateRefreshToken ( user ) ;
212227
228+ // Set secure HTTP-only cookies
213229 res . cookie ( "token" , accessToken , {
214230 httpOnly : true ,
215231 secure : process . env . NODE_ENV === "production" ,
@@ -222,22 +238,23 @@ export const verify2FA = async (req, res, next) => {
222238 sameSite : "Strict" ,
223239 } ) ;
224240
225- logger . info ( " 2FA verified. User logged in:" , user . _id ) ;
241+ logger . info ( ` 2FA verified for user: ${ user . _id } ` ) ;
226242
227243 return res . status ( 200 ) . json ( {
228244 status : "success" ,
229- message : "Login successful" ,
245+ message : "Login successful. " ,
230246 accessToken,
231247 refreshToken,
232248 user : {
249+ id : user . _id ,
233250 username : user . username ,
234251 email : user . email ,
235252 role : user . role ,
236253 status : user . status ,
237254 } ,
238255 } ) ;
239256 } catch ( error ) {
240- handleError ( error , next , "2FA verification error" ) ;
257+ return handleError ( error , next , "2FA verification error" ) ;
241258 }
242259} ;
243260
0 commit comments