Viewing File: /home/ubuntu/efiexchange-node-base/src/middleware/auth.middleware.ts
import { NextFunction, Request, Response } from "express";
import jwt from "jsonwebtoken";
import config from "config";
import logger from "../utils/logger";
import crypto from "crypto";
import { deriveKeysFromUserId } from "./keygen";
export async function authRequest(req: any, res: any, next: NextFunction) {
console.log("Authenticiating")
let payload = req.body;
try {
const token = req.body.token || req.query.token || req.headers["x-access-token"];
if (!token) {
return res.sendErrorCode("A token is required for authentication", 1001);
}
try {
let secretKey = process.env.JWT_SECRET;
const decoded = jwt.verify(token, secretKey);
req.user = decoded;
} catch (err) {
return res.sendErrorCode("Invalid Token", 1001);
}
return next();
} catch (ex) {
return res.sendError(ex);
}
}
export async function authVerification(req: any, res: any, next: NextFunction) {
try {
const timestamp = req.headers["x-api-timestamp"];
const userId = req.headers["x-user-id"];
const receivedApiKey = req.headers["x-api-key"];
const receivedSignature = req.headers["x-api-signature"];
if (!timestamp || !userId || !receivedApiKey || !receivedSignature) {
return res.status(422).json({ message: "Missing auth headers" });
}
const now = Math.floor(Date.now() / 1000);
if (!/^\d+$/.test(timestamp) || Math.abs(now - parseInt(timestamp)) > 300) {
return res.status(423).json({ message: "Invalid or expired timestamp" });
}
const { api_key, salt_key } = deriveKeysFromUserId(userId);
if (receivedApiKey !== api_key) {
return res.status(401).json({ message: "Invalid API Key" });
}
const endpoint = req.originalUrl.split("?")[0];
// console.log(endpoint, "object");
const skipFields = [
"picture", "file", "files", "payment_picture", "import_excel_file", "cover", "payment_file", "document"
];
const body = { ...req.body };
skipFields.forEach(field => delete body[field]);
let bodyStr = JSON.stringify(body || {});
bodyStr = bodyStr.replace(/\\r\\n/g, "\\n").replace(/:null(?=[,}])/g, ':""');
const plainContent = `${endpoint}${bodyStr}${timestamp}${salt_key}`;
const expectedSignature = crypto.createHmac("sha256", api_key).update(plainContent).digest("hex");
// console.log("Authenticiating", expectedSignature, receivedSignature);
const isMatch = crypto.timingSafeEqual(
Buffer.from(expectedSignature),
Buffer.from(receivedSignature)
);
if (!isMatch) {
return res.status(401).json({ message: "Signature mismatch" });
}
req.user = { user_id: userId };
return next();
} catch (error: any) {
return res.status(500).json({ message: "Auth error", error: error.message });
}
}
Back to Directory
File Manager