moahmedwafy's picture
feat: auth refactors
2f0e1b7
raw
history blame
1.25 kB
import { JwtPayload, verify } from "jsonwebtoken";
import { Request } from "express";
import { Role } from "@common/enums/role.enum";
import { HttpError } from "@lib/error-handling/http-error";
import { config } from "@configs/config";
import { IJwtLoginPayload } from "@common/interfaces/jwt-payload.interface";
type AdminGuardMiddlewareProps = {
roles?: Role[];
};
export const AdminGuardMiddleware =
(props?: AdminGuardMiddlewareProps) => (req: Request, res, next) => {
// get token from cookie
const token = req.headers.authorization?.split(" ")[1];
let payload: IJwtLoginPayload;
// validate token
if (!token) {
throw new HttpError(401, "Unauthorized");
}
try {
payload = verify(token, config.jwt.secret);
} catch (err) {
throw new HttpError(401, "Unauthorized");
}
if (payload.type !== "admin") {
throw new HttpError(401, "Unauthorized");
}
// check roles
if (props?.roles && props?.roles.length > 0) {
if (!props.roles.includes(payload.role)) {
throw new HttpError(401, "Unauthorized");
}
}
// inject payload in request
(req as unknown as { jwtPayload: JwtPayload }).jwtPayload = payload;
// go on
next();
};