Files
Checkmate/Server/middleware/isAllowed.js
T

60 lines
1.6 KiB
JavaScript
Raw Normal View History

2024-10-15 11:57:37 +08:00
import jwt from "jsonwebtoken";
const TOKEN_PREFIX = "Bearer ";
const SERVICE_NAME = "allowedRoles";
2024-12-24 12:00:36 -08:00
import ServiceRegistry from "../service/serviceRegistry.js";
import SettingsService from "../service/settingsService.js";
2024-10-15 11:57:37 +08:00
import { errorMessages } from "../utils/messages.js";
const isAllowed = (allowedRoles) => {
2024-10-17 12:07:30 +08:00
return (req, res, next) => {
const token = req.headers["authorization"];
2024-10-17 12:07:30 +08:00
// If no token is pressent, return an error
if (!token) {
const error = new Error(errorMessages.NO_AUTH_TOKEN);
error.status = 401;
error.service = SERVICE_NAME;
next(error);
return;
}
2024-10-17 12:07:30 +08:00
// If the token is improperly formatted, return an error
if (!token.startsWith(TOKEN_PREFIX)) {
const error = new Error(errorMessages.INVALID_AUTH_TOKEN);
error.status = 400;
error.service = SERVICE_NAME;
next(error);
return;
}
// Parse the token
try {
const parsedToken = token.slice(TOKEN_PREFIX.length, token.length);
2024-12-24 12:00:36 -08:00
const { jwtSecret } = ServiceRegistry.get(
SettingsService.SERVICE_NAME
).getSettings();
2024-10-17 12:07:30 +08:00
var decoded = jwt.verify(parsedToken, jwtSecret);
const userRoles = decoded.role;
2024-10-17 12:07:30 +08:00
// Check if the user has the required role
if (userRoles.some((role) => allowedRoles.includes(role))) {
next();
return;
} else {
const error = new Error(errorMessages.INSUFFICIENT_PERMISSIONS);
error.status = 401;
error.service = SERVICE_NAME;
next(error);
return;
}
} catch (error) {
error.status = 401;
error.method = "isAllowed";
error.service = SERVICE_NAME;
next(error);
return;
}
};
};
2024-10-15 11:57:37 +08:00
export { isAllowed };