From d144704066a19445c0631892bff0167e3ee3887a Mon Sep 17 00:00:00 2001 From: Owen Schwartz Date: Sun, 6 Oct 2024 18:43:20 -0400 Subject: [PATCH] Fix login stuff? --- bruno/Auth/signup.bru | 11 ++++++++++ bruno/Auth/verify-email.bru | 18 ++++++++++++++++ bruno/Users/getUser.bru | 11 ++++++++++ server/routers/external.ts | 3 ++- server/routers/user/getUser.ts | 36 ++++++++++++------------------- src/app/auth/login/page.tsx | 7 ++---- src/app/page.tsx | 4 ++-- src/components/LoginForm.tsx | 2 +- src/contexts/userContext.ts | 2 +- src/lib/verifySession.ts | 17 +++++++++++---- src/providers/LandingProvider.tsx | 2 +- 11 files changed, 76 insertions(+), 37 deletions(-) create mode 100644 bruno/Auth/signup.bru create mode 100644 bruno/Auth/verify-email.bru create mode 100644 bruno/Users/getUser.bru diff --git a/bruno/Auth/signup.bru b/bruno/Auth/signup.bru new file mode 100644 index 00000000..7937fad6 --- /dev/null +++ b/bruno/Auth/signup.bru @@ -0,0 +1,11 @@ +meta { + name: signup + type: http + seq: 2 +} + +get { + url: + body: none + auth: none +} diff --git a/bruno/Auth/verify-email.bru b/bruno/Auth/verify-email.bru new file mode 100644 index 00000000..5a6163bf --- /dev/null +++ b/bruno/Auth/verify-email.bru @@ -0,0 +1,18 @@ +meta { + name: verify-email + type: http + seq: 3 +} + +put { + url: http://localhost:3000/api/v1/auth/signup + body: json + auth: none +} + +body:json { + { + "email": "owen@fossorial.io", + "password": "Password123!" + } +} diff --git a/bruno/Users/getUser.bru b/bruno/Users/getUser.bru new file mode 100644 index 00000000..d8637252 --- /dev/null +++ b/bruno/Users/getUser.bru @@ -0,0 +1,11 @@ +meta { + name: getUser + type: http + seq: 1 +} + +get { + url: + body: none + auth: none +} diff --git a/server/routers/external.ts b/server/routers/external.ts index 4dccfc4b..38744805 100644 --- a/server/routers/external.ts +++ b/server/routers/external.ts @@ -93,7 +93,8 @@ authenticated.delete( authenticated.get("/users", user.listUsers); // authenticated.get("/org/:orgId/users", user.???); // TODO: Implement this -authenticated.get("/user/:userId", user.getUser); +authenticated.get("/user", user.getUser); +// authenticated.get("/user/:userId", user.getUser); authenticated.delete("/user/:userId", user.deleteUser); // Auth routes diff --git a/server/routers/user/getUser.ts b/server/routers/user/getUser.ts index cd949be5..41d62b06 100644 --- a/server/routers/user/getUser.ts +++ b/server/routers/user/getUser.ts @@ -9,29 +9,20 @@ import createHttpError from 'http-errors'; import { ActionsEnum, checkUserActionPermission } from '@server/auth/actions'; import logger from '@server/logger'; -const getUserSchema = z.object({ - userId: z.string().uuid() -}); export async function getUser(req: Request, res: Response, next: NextFunction): Promise { try { - const parsedParams = getUserSchema.safeParse(req.params); - if (!parsedParams.success) { - return next( - createHttpError( - HttpCode.BAD_REQUEST, - parsedParams.error.errors.map(e => e.message).join(', ') - ) - ); + const userId = req.user?.id; + + if (!userId) { + return next(createHttpError(HttpCode.UNAUTHORIZED, "User not found")); } - const { userId } = parsedParams.data; - - // Check if the user has permission to list sites - const hasPermission = await checkUserActionPermission(ActionsEnum.getUser, req); - if (!hasPermission) { - return next(createHttpError(HttpCode.FORBIDDEN, 'User does not have permission to list sites')); - } + // // Check if the user has permission to list sites + // const hasPermission = await checkUserActionPermission(ActionsEnum.getUser, req); + // if (!hasPermission) { + // return next(createHttpError(HttpCode.FORBIDDEN, 'User does not have permission to list sites')); + // } const user = await db.select() .from(users) @@ -47,11 +38,12 @@ export async function getUser(req: Request, res: Response, next: NextFunction): ); } - // Remove passwordHash from the response - const { passwordHash: _, ...userWithoutPassword } = user[0]; - return response(res, { - data: userWithoutPassword, + data: { + email: user[0].email, + twoFactorEnabled: user[0].twoFactorEnabled, + emailVerified: user[0].emailVerified + }, success: true, error: false, message: "User retrieved successfully", diff --git a/src/app/auth/login/page.tsx b/src/app/auth/login/page.tsx index ee3311ac..6f76c8e7 100644 --- a/src/app/auth/login/page.tsx +++ b/src/app/auth/login/page.tsx @@ -2,8 +2,8 @@ import LoginForm from "@app/components/LoginForm"; import { verifySession } from "@app/lib/verifySession"; import { redirect } from "next/navigation"; -export async function Page() { - const { user } = await verifySession(); +export default async function Page() { + const user = await verifySession(); if (user) { redirect("/"); @@ -15,6 +15,3 @@ export async function Page() { ); } - -export default Page; - diff --git a/src/app/page.tsx b/src/app/page.tsx index 7ea646f1..0de05fec 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,7 @@ import { LandingProvider } from "@app/providers/LandingProvider"; import { redirect } from "next/navigation"; export default async function Page() { - const { user } = await verifySession(); + const user = await verifySession(); if (!user) { redirect("/auth/login"); @@ -12,7 +12,7 @@ export default async function Page() { return ( <> -

You're logged in!

+

You are logged in!

); diff --git a/src/components/LoginForm.tsx b/src/components/LoginForm.tsx index 9e5f9b22..112c9fc5 100644 --- a/src/components/LoginForm.tsx +++ b/src/components/LoginForm.tsx @@ -25,7 +25,7 @@ import { Alert, AlertDescription } from "@/components/ui/alert"; import { ExclamationTriangleIcon } from "@radix-ui/react-icons"; import { LoginResponse } from "@server/routers/auth"; import { api } from "@app/api"; -import { useParams, useRouter } from "next/navigation"; +import { useRouter } from "next/navigation"; type LoginFormProps = { redirect?: string; diff --git a/src/contexts/userContext.ts b/src/contexts/userContext.ts index 9eb8f229..7c46ffc1 100644 --- a/src/contexts/userContext.ts +++ b/src/contexts/userContext.ts @@ -1,3 +1,3 @@ import { createContext } from "react"; -export const UserContext = createContext<{ id: string } | null>(null); +export const UserContext = createContext(null); diff --git a/src/lib/verifySession.ts b/src/lib/verifySession.ts index ea47b51b..010d1044 100644 --- a/src/lib/verifySession.ts +++ b/src/lib/verifySession.ts @@ -1,8 +1,17 @@ +import api from "@app/api"; import { cookies } from "next/headers"; -import lucia from "@server/auth"; export async function verifySession() { - const sessionId = cookies().get(lucia.sessionCookieName)?.value ?? null; - const session = await lucia.validateSession(sessionId || ""); - return session; + const sessionId = cookies().get("session")?.value ?? null; + + try { + const res = await api.get("/user", { + headers: { + Cookie: `session=${sessionId}` + } + }); + return true; + } catch { + return false + } } diff --git a/src/providers/LandingProvider.tsx b/src/providers/LandingProvider.tsx index 215f871e..de71fea8 100644 --- a/src/providers/LandingProvider.tsx +++ b/src/providers/LandingProvider.tsx @@ -4,7 +4,7 @@ import { UserContext } from "@app/contexts/userContext"; import { ReactNode } from "react"; type LandingProviderProps = { - user: any; + user: boolean ; children: ReactNode; };