From 67d4878c598009eb9580fbd9dabb1cbde3265457 Mon Sep 17 00:00:00 2001 From: Stefan-5422 <32109571+Stefan-5422@users.noreply.github.com> Date: Wed, 23 Mar 2022 12:56:10 +0100 Subject: [PATCH] Add Auth middleware; --- src/custom.d.ts | 7 +++++ src/middleware/auth.middle.ts | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/custom.d.ts create mode 100644 src/middleware/auth.middle.ts diff --git a/src/custom.d.ts b/src/custom.d.ts new file mode 100644 index 0000000..125a465 --- /dev/null +++ b/src/custom.d.ts @@ -0,0 +1,7 @@ +import { authJwt } from "./controller/auth.controller"; + +declare module "express-serve-static-core" { + interface Request { + auth?: authJwt & { isAuthenthicated: boolean }; + } +} diff --git a/src/middleware/auth.middle.ts b/src/middleware/auth.middle.ts new file mode 100644 index 0000000..6b871b7 --- /dev/null +++ b/src/middleware/auth.middle.ts @@ -0,0 +1,50 @@ +import { NextFunction, Request, Response } from "express"; +import { createDefaultError } from "../lib/standardResponse"; +import jwt, { JwtPayload } from "jsonwebtoken"; +import { authJwt } from "../controller/auth.controller"; +import prisma from "../lib/prisma.lib"; + +const verifyAuthorizationFormat = (authorization: string) => /^Bearer .+$/.test(authorization); + +const getBearerToken = (authorization: string) => authorization.slice(7); + +const JWT_SECRET = process.env.jwtsecret || "secret"; + +export const requireAuthentication = async (req: Request, res: Response, next: NextFunction) => { + const { authorization } = req.headers; + + if (!authorization) { + return res.status(403).json(createDefaultError("The request did not contain a authorization header", null)); + } + + if (!verifyAuthorizationFormat(authorization)) { + return res.status(400).json(createDefaultError("Malformed Bearer Token", { format: "Bearer " })); + } + + let payload_: string | JwtPayload; + + try { + payload_ = jwt.verify(getBearerToken(authorization), JWT_SECRET); + } catch (e) { + return res.status(403).json(createDefaultError("The Token could not be verified, it might be expiered", null)); + } + + const payload = payload_ as authJwt; + + const { id } = payload; + + const user = await prisma.user.findUnique({ + where: { id }, + select: { + role: true, + }, + }); + + req.auth = { + isAuthenthicated: true, + id, + role: user?.role || "user", + }; + + next(); +};