90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
// ENVIRONMENT
|
|
require('dotenv').config();
|
|
|
|
// LIBRARY
|
|
const jwt = require("jsonwebtoken");
|
|
|
|
const { PrismaClient: CMSClient } = require("../../prisma/clients/cms");
|
|
|
|
// CONSTANT
|
|
const { JWT_SECRET_KEY } = process.env;
|
|
|
|
// RESPONSES
|
|
const { badRequestResponse} = require("../res/responses");
|
|
const {expiredTokenResponse } = require("../res/responses");
|
|
const { invalidTokenResponse } = require("../res/responses");
|
|
|
|
// PRISMA
|
|
const prisma = new CMSClient();
|
|
|
|
|
|
// MIDDLEWARE
|
|
const validateApiKey = async (req, res, next) => {
|
|
try {
|
|
const apiKey = req.headers['x-api-key'];
|
|
|
|
if (!apiKey) {
|
|
return badRequestResponse(res, "API key is required", "Missing x-api-key header");
|
|
}
|
|
|
|
const validCredential = await prisma.appCredential.findUnique({
|
|
where: {
|
|
TokenCredential_AC: apiKey
|
|
}
|
|
});
|
|
|
|
if (!validCredential) {
|
|
return badRequestResponse(res, "Invalid API key", "Unauthorized access");
|
|
}
|
|
return next();
|
|
} catch (err) {
|
|
return badRequestResponse(res, "Error validating API key", err);
|
|
}
|
|
};
|
|
|
|
const authenticateToken = async (req, res, next) => {
|
|
const authHeader = req.headers['authorization'];
|
|
let token = null;
|
|
|
|
if (authHeader) {
|
|
token = authHeader.split(' ')[1];
|
|
}
|
|
|
|
if (!authHeader) {
|
|
return badRequestResponse(res, "Unauthorized");
|
|
}
|
|
|
|
try {
|
|
const decoded = jwt.verify(token, JWT_SECRET_KEY);
|
|
|
|
const isUserExist = await prisma.adminAccount.findFirst({
|
|
where: {
|
|
UUID_AA: decoded.userID,
|
|
}
|
|
});
|
|
|
|
if (isUserExist) {
|
|
const currentTime = Math.floor(new Date().getTime() / 1000);
|
|
const tokenIssuedAt = decoded.iat;
|
|
|
|
const expiryTime = 60 * 60 * 24 * 7;
|
|
|
|
if (currentTime - tokenIssuedAt > expiryTime) {
|
|
return expiredTokenResponse(res, "Token expired!");
|
|
}
|
|
|
|
req.locals = { user: decoded.userID };
|
|
|
|
return next();
|
|
|
|
} else {
|
|
return invalidTokenResponse(res, "Invalid token!");
|
|
}
|
|
|
|
} catch (err) {
|
|
return invalidTokenResponse(res, "Invalid token!");
|
|
}
|
|
};
|
|
|
|
|
|
module.exports = { validateApiKey, authenticateToken }; |