va-tracker-middleware/src/middlewares/auth.middleware.js

103 lines
3.2 KiB
JavaScript

import jwt from "jsonwebtoken";
import { VAModel, ClientModel } from "../models/vaModel.js";
import logger from "../config/logger.js";
async function authValidator(req, res, next) {
try {
const sf_token = req.headers.sf_token;
if (sf_token) {
const { vaId } = req.params;
if(vaId) req.body.vaId = vaId;
next();
} else {
const accessToken = req.headers.token;
if (!accessToken) return res.status(401).json({ success: false, message: "Not Authorized" });
// return res.status(200).json({
// success: true,
// message: "Log Out Successfull",
// });
const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN);
if (decoded && ("id" in decoded) && decoded.id !== null && ("email" in decoded)) {
const vaEmail = decoded.email;
const vaUser = await VAModel.findOne({ "userDetails.email": vaEmail })
if (!vaUser) {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
if (!("accessToken" in vaUser) || !vaUser.accessToken) {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
if (vaUser.accessToken === accessToken) {
req.body.vaId = vaUser._id
req.body.vaEmail = vaEmail
next();
} else {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
}
}
} catch (error) {
logger.error("AuthValidator - Middleware (CATCH Block)", error.message);
return res.send(401).status({ "message": error.message })
}
}
async function clientAuthValidator(req, res, next) {
try {
const accessToken = req.headers.token;
if (!accessToken) {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN);
if (decoded && decoded.id && decoded.email) {
const clientEmail = decoded.email;
const clientUser = await ClientModel.findOne({ "userDetails.email": clientEmail });
if (!clientUser) {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
if (!clientUser.accessToken || clientUser.accessToken !== accessToken) {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
// Attach client info to request object for use in subsequent middleware/controllers
req.body.clientId = clientUser._id;
req.body.clientEmail = clientEmail;
req.body.clientName = decoded.name;
next();
} else {
return res.status(401).json({ success: false, message: "Not Authorized" });
}
} catch (error) {
logger.error("clientAuthValidator - Middleware (CATCH Block)", error.message);
if (error.name === "TokenExpiredError") {
return res.status(401).json({ success: false, message: "Token expired" });
}
if (error.name === "JsonWebTokenError") {
return res.status(401).json({ success: false, message: "Invalid token" });
}
return res.status(401).json({ success: false, message: "Authentication failed" });
}
}
export {
authValidator,
clientAuthValidator
}