From c7cbc3d8c00edd0d8c0f421cb1c2efeb16603d76 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Fri, 6 Sep 2024 11:48:43 +0100 Subject: [PATCH] Fix session handling and update auth pages --- .vscode/settings.json | 2 +- bun.lockb | Bin 281894 -> 283032 bytes package.json | 42 ++++---- src/app/(site)/(auth)/layout.tsx | 25 ++++- src/app/(site)/(auth)/register/page.tsx | 48 +++------ src/app/(site)/(auth)/signin/page.tsx | 130 ++++------------------- src/app/page.tsx | 2 + src/components/forms/auth/SignInForm.tsx | 128 ++++++++++++++++++++++ src/server/api/routers/auth.ts | 14 --- src/server/auth.ts | 46 +++++--- 10 files changed, 241 insertions(+), 196 deletions(-) create mode 100644 src/components/forms/auth/SignInForm.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index d94e71c..cae72af 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "workbench.colorTheme": "City Lights" + "workbench.colorTheme": "Tinacious Design (High Contrast)" } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 5043618f986e826d92fcb7157ba3cc564ef7d439..fb08ec3ae686148b226fe2552bfade2ebc5ca22d 100755 GIT binary patch delta 54275 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νGY`Pw!N;&vkBQt=`$vZv<3C4C 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 ASpWb4 diff --git a/package.json b/package.json index 1b22df7..867e8c4 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "start": "next start" }, "dependencies": { - "@auth/drizzle-adapter": "^1.1.0", - "@headlessui/react": "^2.1.4", + "@auth/drizzle-adapter": "^1.4.2", + "@headlessui/react": "^2.1.5", "@hookform/resolvers": "^3.9.0", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", @@ -45,8 +45,8 @@ "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", - "@t3-oss/env-nextjs": "^0.10.1", - "@tanstack/react-query": "^5.50.0", + "@t3-oss/env-nextjs": "^0.11.1", + "@tanstack/react-query": "^5.54.1", "@trpc/client": "^11.0.0-rc.446", "@trpc/react-query": "^11.0.0-rc.446", "@trpc/server": "^11.0.0-rc.446", @@ -62,19 +62,19 @@ "date-fns": "^3.6.0", "drizzle-orm": "^0.33.0", "embla-carousel-react": "^8.2.1", - "geist": "^1.3.0", + "geist": "^1.3.1", "input-otp": "^1.2.4", "lodash": "^4.17.21", "loglevel": "^1.9.1", "loglevel-plugin-prefix": "^0.8.4", "lucide-react": "^0.438.0", - "next": "^14.2.4", + "next": "^14.2.8", "next-auth": "^4.24.7", "next-themes": "^0.3.0", "postgres": "^3.4.4", "react": "^18.3.1", "react-copy-to-clipboard": "^5.1.0", - "react-day-picker": "8.10.1", + "react-day-picker": "9.0.8", "react-dom": "^18.3.1", "react-hook-form": "^7.53.0", "react-icons": "^5.3.0", @@ -85,25 +85,25 @@ "superjson": "^2.2.1", "tailwind-merge": "^2.5.2", "tailwindcss-animate": "^1.0.7", - "vaul": "^0.9.1", + "vaul": "^0.9.2", "zod": "^3.23.8" }, "devDependencies": { - "@types/eslint": "^8.56.10", - "@types/node": "^20.14.10", - "@types/react": "^18.3.3", + "@types/eslint": "^9.6.1", + "@types/node": "^22.5.4", + "@types/react": "^18.3.5", "@types/react-dom": "^18.3.0", - "@typescript-eslint/eslint-plugin": "^8.1.0", - "@typescript-eslint/parser": "^8.1.0", - "drizzle-kit": "^0.24.0", - "eslint": "^8.57.0", - "eslint-config-next": "^14.2.4", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "drizzle-kit": "^0.24.2", + "eslint": "^9.9.1", + "eslint-config-next": "^14.2.8", "eslint-plugin-drizzle": "^0.2.3", - "postcss": "^8.4.39", - "prettier": "^3.3.2", - "prettier-plugin-tailwindcss": "^0.6.5", - "tailwindcss": "^3.4.3", - "typescript": "^5.5.3" + "postcss": "^8.4.45", + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.6", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.4" }, "ct3aMetadata": { "initVersion": "7.37.0" diff --git a/src/app/(site)/(auth)/layout.tsx b/src/app/(site)/(auth)/layout.tsx index a8e6032..67c2cef 100644 --- a/src/app/(site)/(auth)/layout.tsx +++ b/src/app/(site)/(auth)/layout.tsx @@ -1,7 +1,30 @@ +import Link from "next/link"; +import { Icons } from "@/components/icons"; +import { cn } from "@/lib/utils"; +import { buttonVariants } from "@/components/ui/button"; interface AuthLayoutProps { children: React.ReactNode; } export default function AuthLayout({ children }: AuthLayoutProps) { - return
{children}
; + return ( +
+
+ + <> + + Back + + + + {children} +
+
+ ); } diff --git a/src/app/(site)/(auth)/register/page.tsx b/src/app/(site)/(auth)/register/page.tsx index 7824faf..39066b8 100644 --- a/src/app/(site)/(auth)/register/page.tsx +++ b/src/app/(site)/(auth)/register/page.tsx @@ -10,40 +10,22 @@ import { buttonVariants } from "@/components/ui/button"; const RegisterPage: React.FC = () => { return ( -
- - <> - - Back - - -
-
- -

- Welcome back -

-

- Enter your email to sign in to your account -

-
- - -

- - Don't have an account? Sign Up - -

+
+
+ +

Welcome

+

Register for an account

+ + +

+ + Already have an account? Login? + +

); }; diff --git a/src/app/(site)/(auth)/signin/page.tsx b/src/app/(site)/(auth)/signin/page.tsx index 9bb8e58..f2e7d82 100644 --- a/src/app/(site)/(auth)/signin/page.tsx +++ b/src/app/(site)/(auth)/signin/page.tsx @@ -2,121 +2,31 @@ import SocialLogin from "@/components/widgets/login/SocialLogin"; import Link from "next/link"; import React from "react"; -import { logger } from "@/lib/logger"; -import { signIn } from "next-auth/react"; +import { Icons } from "@/components/icons"; +import { cn } from "@/lib/utils"; +import { buttonVariants } from "@/components/ui/button"; +import SignInForm from "@/components/forms/auth/SignInForm"; const SignInPage = () => { - const [userInfo, setUserInfo] = React.useState({ - email: "fergal.moran+opengifame@gmail.com", - password: "secret", - }); - return ( -
-
-

- Sign in to your account -

-

- Or - - create a new account - +

); }; diff --git a/src/app/page.tsx b/src/app/page.tsx index 71d36ad..6366cd0 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -18,6 +18,8 @@ export default async function Home() { + +
{JSON.stringify(session, null, 2)}
{session?.user && }
diff --git a/src/components/forms/auth/SignInForm.tsx b/src/components/forms/auth/SignInForm.tsx new file mode 100644 index 0000000..777d341 --- /dev/null +++ b/src/components/forms/auth/SignInForm.tsx @@ -0,0 +1,128 @@ +// src/components/RegistrationForm.tsx +import React from "react"; +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { z } from "zod"; +import { Button, buttonVariants } from "@/components/ui/button"; +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { api } from "@/trpc/react"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { logger } from "@/lib/logger"; +import { Icons } from "@/components/icons"; +import { cn } from "@/lib/utils"; +import { toast } from "sonner"; +import { useRouter } from "next/navigation"; +import { signIn } from "next-auth/react"; + +const signInSchema = z.object({ + email: z.string().email({ message: "Invalid email address" }), + password: z + .string() + .min(5, { message: "Password must be at least 5 characters long" }), +}); + +type SignInFormValues = z.infer; + +const SignInForm: React.FC = () => { + const [isLoading, setIsLoading] = React.useState(false); + const router = useRouter(); + const form = useForm({ + resolver: zodResolver(signInSchema), + }); + + const onSubmit = async (data: SignInFormValues) => { + setIsLoading(true); + try { + const result = await signIn("credentials", { + redirect: false, + email: data.email, + password: data.password, + }); + logger.debug("signin", "result", result); + if (result?.status === 200) { + router.push("/"); + } + } catch (error) { + logger.error("SignInForm", "error", error); + toast("Failed to signin user"); + } finally { + setIsLoading(false); + } + }; + + return ( +
+ +
+
+ ( + + Email + + + + {form.formState.errors.email && ( + + {form.formState.errors.email.message} + + )} + + )} + /> + ( + + Password + + + + {form.formState.errors.password && ( + + {form.formState.errors.password.message} + + )} + + )} + /> + {form.formState.errors && false && ( + + + Heads up! + + {JSON.stringify(form.formState.errors)} + + + )} +
+ +
+
+ + ); +}; + +export default SignInForm; diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts index 6802220..0bf0d4e 100644 --- a/src/server/api/routers/auth.ts +++ b/src/server/api/routers/auth.ts @@ -16,18 +16,4 @@ export const authRouter = createTRPCRouter({ return user; }), - login: publicProcedure - .input(z.object({ email: z.string().email(), password: z.string().min(5) })) - .query(async ({ ctx, input }) => { - const hashedPassword = await bcrypt.hash(input.password, 10); - const user = await ctx.db - .select() - .from(users) - .where( - and(eq(users.email, input.email), eq(users.password, hashedPassword)), - ) - .limit(1); - - return user[0]; - }), }); diff --git a/src/server/auth.ts b/src/server/auth.ts index cdd6ba5..4c4414d 100644 --- a/src/server/auth.ts +++ b/src/server/auth.ts @@ -1,10 +1,8 @@ import { DrizzleAdapter } from "@auth/drizzle-adapter"; -import CredentialsProvider from "next-auth/providers/credentials"; import { getServerSession, type DefaultSession, type NextAuthOptions, - RequestInternal, } from "next-auth"; import { type Adapter } from "next-auth/adapters"; import { @@ -13,11 +11,12 @@ import { users, verificationTokens, } from "@/server/db/schema"; -import { api } from "@/trpc/server"; import { env } from "@/env"; import { db } from "@/server/db"; import Credentials from "next-auth/providers/credentials"; +import bcrypt from "bcrypt"; +import { and, eq } from "drizzle-orm"; declare module "next-auth" { interface Session extends DefaultSession { @@ -29,13 +28,18 @@ declare module "next-auth" { export const authOptions: NextAuthOptions = { callbacks: { - session: ({ session, user }) => ({ - ...session, - user: { - ...session.user, - id: user.id, - }, - }), + session: ({ session, user }) => { + const s = { + ...session, + user: { + ...session.user + }, + }; + return s; + }, + }, + session: { + strategy: "jwt", }, adapter: DrizzleAdapter(db, { usersTable: users, @@ -54,14 +58,24 @@ export const authOptions: NextAuthOptions = { if (!credentials) { return null; } - const result = await api.auth.login({ - email: credentials.email, - password: credentials.password, - }); - if (!result) { + const user = await db + .select() + .from(users) + .where(and(eq(users.email, credentials.email))) + .limit(1); + + if (!user || user.length < 1) { return null; } - return { id: result.id, email: result.email }; + if ( + !(await bcrypt.compare( + credentials.password, + user[0]!.password as string, + )) + ) { + return null; + } + return { id: user[0]!.id, email: user[0]!.email }; }, }), ],