From 942dbd8e5636bd1f6d010e7ed1c0e9aeaae2c87d Mon Sep 17 00:00:00 2001 From: Milo Schwartz Date: Wed, 2 Oct 2024 23:54:14 -0400 Subject: [PATCH] added auth middleware --- server/middlewares/index.ts | 1 + server/middlewares/verifySession.ts | 33 +++++++++++++++++++++++++++++ server/routers/external.ts | 2 ++ server/types/Auth.ts | 8 +++++++ 4 files changed, 44 insertions(+) create mode 100644 server/middlewares/verifySession.ts create mode 100644 server/types/Auth.ts diff --git a/server/middlewares/index.ts b/server/middlewares/index.ts index fa3d0805..8e32b200 100644 --- a/server/middlewares/index.ts +++ b/server/middlewares/index.ts @@ -1,3 +1,4 @@ export * from "./notFound"; export * from "./rateLimit"; export * from "./formatError"; +export * from "./verifySession"; diff --git a/server/middlewares/verifySession.ts b/server/middlewares/verifySession.ts new file mode 100644 index 00000000..998fbdbc --- /dev/null +++ b/server/middlewares/verifySession.ts @@ -0,0 +1,33 @@ +import { NextFunction, Response, Request } from "express"; +import ErrorResponse from "@server/types/ErrorResponse"; +import { unauthorized, verifySession } from "@server/auth"; +import { db } from "@server/db"; +import { users } from "@server/db/schema"; +import { eq } from "drizzle-orm"; +import createHttpError from "http-errors"; +import HttpCode from "@server/types/HttpCode"; + +export const verifySessionMiddleware = async ( + req: any, + res: Response, + next: NextFunction, +) => { + const { session, user } = await verifySession(req); + if (!session || !user) { + return next(unauthorized()); + } + + const existingUser = await db + .select() + .from(users) + .where(eq(users.id, user.id)); + + if (!existingUser || !existingUser[0]) { + return next( + createHttpError(HttpCode.BAD_REQUEST, "User does not exist"), + ); + } + + req.user = existingUser[0]; + req.session = session; +}; diff --git a/server/routers/external.ts b/server/routers/external.ts index ec6de3e7..a7f449cc 100644 --- a/server/routers/external.ts +++ b/server/routers/external.ts @@ -6,6 +6,7 @@ import * as target from "./target"; import * as user from "./user"; import * as auth from "./auth"; import HttpCode from "@server/types/HttpCode"; +import { verifySessionMiddleware } from "@server/middlewares"; // Root routes export const unauthenticated = Router(); @@ -16,6 +17,7 @@ unauthenticated.get("/", (_, res) => { // Authenticated Root routes export const authenticated = Router(); +authenticated.use(verifySessionMiddleware); authenticated.put("/org", org.createOrg); authenticated.get("/orgs", org.listOrgs); diff --git a/server/types/Auth.ts b/server/types/Auth.ts new file mode 100644 index 00000000..7146d851 --- /dev/null +++ b/server/types/Auth.ts @@ -0,0 +1,8 @@ +import { Request } from "express"; +import { User } from "@server/db/schema"; +import { Session } from "lucia"; + +export interface AuthenticatedRequest extends Request { + user: User; + session: Session; +}