CentralBackend/middleware/authMiddleware.js
2025-11-18 01:21:09 +01:00

55 lines
1.8 KiB
JavaScript

const jwt = require('jsonwebtoken');
const { logger } = require('./logger');
function authMiddleware(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith('Bearer ')) {
return res.status(401).json({ success: false, message: 'No access token provided' });
}
const token = authHeader.split(' ')[1];
try {
const payload = jwt.verify(token, process.env.JWT_SECRET);
// edit profile context awareness
const isEditProfile =
req.originalUrl?.includes('/profile/personal') ||
req.baseUrl?.includes('/profile/personal');
// derive and log user type data
const derivedUserType = payload.userType ?? payload.user_type ?? payload.type;
const authDebug = {
context: isEditProfile ? 'edit-profile' : 'general',
method: req.method,
route: req.originalUrl,
id: payload.id ?? payload.userId ?? payload.sub,
email: payload.email,
userType: payload.userType,
user_type: payload.user_type,
derivedUserType,
payloadKeys: Object.keys(payload || {})
};
logger.info(`authMiddleware:verified context=${authDebug.context} userType=${authDebug.derivedUserType}`, authDebug);
// console fallback for local dev
console.log('[authMiddleware] verified', authDebug);
// Attach user info to request (with normalized userType for downstream checks)
req.user = {
...payload,
userType: payload.userType ?? payload.user_type,
user_type: payload.user_type ?? payload.userType
};
next();
} catch (error) {
logger.warn('authMiddleware:tokenInvalid', {
method: req.method,
route: req.originalUrl,
reason: error?.message
});
return res.status(401).json({ success: false, message: 'Invalid or expired access token' });
}
}
module.exports = authMiddleware;