From 0363c9c1abe75dfcad46c2b31bc044ab75ef82ff Mon Sep 17 00:00:00 2001 From: Lee Robinson Date: Thu, 12 Oct 2023 16:35:00 -0500 Subject: [PATCH] add `next-auth` fixes (#211) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Balázs Orbán --- dashboard/15-final/app/ui/login-form.tsx | 6 ++++-- dashboard/15-final/auth.ts | 19 ++++++++++++------- dashboard/15-final/middleware.ts | 4 ---- dashboard/15-final/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/dashboard/15-final/app/ui/login-form.tsx b/dashboard/15-final/app/ui/login-form.tsx index 8c41f07..2e8fde1 100644 --- a/dashboard/15-final/app/ui/login-form.tsx +++ b/dashboard/15-final/app/ui/login-form.tsx @@ -15,9 +15,9 @@ export default async function LoginForm() {
{ + action={async (formData) => { 'use server'; - await signIn('credentials'); + await signIn('credentials', Object.fromEntries(formData)); }} className="space-y-3" > @@ -38,6 +38,7 @@ export default async function LoginForm() { className="peer block w-full rounded-md border border-gray-200 py-[9px] pl-10 text-sm outline-2 placeholder:text-gray-500" id="email" type="email" + name="email" placeholder="Enter your email address" /> @@ -55,6 +56,7 @@ export default async function LoginForm() { className="peer block w-full rounded-md border border-gray-200 py-[9px] pl-10 text-sm outline-2 placeholder:text-gray-500" id="password" type="password" + name="password" placeholder="Enter password" /> diff --git a/dashboard/15-final/auth.ts b/dashboard/15-final/auth.ts index c1d9439..88aac2c 100644 --- a/dashboard/15-final/auth.ts +++ b/dashboard/15-final/auth.ts @@ -1,13 +1,13 @@ import NextAuth from 'next-auth'; import Credentials from 'next-auth/providers/credentials'; import bcrypt from 'bcrypt'; -import { User } from '@/app/lib/definitions'; import { sql } from '@vercel/postgres'; +import type { User } from '@/app/lib/definitions'; async function getUser(email: string) { try { - const user = await sql`SELECT * from USERS where email=${email}`; - return user.rows[0] as User; + const user = await sql`SELECT * from USERS where email=${email}`; + return user.rows[0]; } catch (error) { console.error('Failed to fetch user:', error); throw new Error('Failed to fetch user.'); @@ -27,16 +27,16 @@ export const { password: { label: 'Password', type: 'password' }, email: { label: 'Email', type: 'email' }, }, - // @ts-ignore async authorize(credentials) { const { email, password } = credentials ?? {}; - const user = await getUser(email as string); - + // @ts-expect-error TODO: Validate email type with zod + const user = await getUser(email); if (!user || !password) { console.log('Missing credentials'); return null; } + // @ts-expect-error TODO: Validate password type with zod const passwordsMatch = await bcrypt.compare(password, user.password); if (!passwordsMatch) { @@ -44,10 +44,15 @@ export const { return null; } - return user; + return { ...user, id: user.id.toString() }; }, }), ], + callbacks: { + authorized({ auth, request: { nextUrl } }) { + return !nextUrl.pathname.startsWith('/dashboard') || !!auth?.user; + }, + }, pages: { signIn: '/login', }, diff --git a/dashboard/15-final/middleware.ts b/dashboard/15-final/middleware.ts index 449e3f2..db54448 100644 --- a/dashboard/15-final/middleware.ts +++ b/dashboard/15-final/middleware.ts @@ -1,5 +1 @@ export { auth as middleware } from './auth'; - -export const config = { - matcher: ['/dashboard/:path*'], -}; diff --git a/dashboard/15-final/package.json b/dashboard/15-final/package.json index 9a2b492..6de37f4 100644 --- a/dashboard/15-final/package.json +++ b/dashboard/15-final/package.json @@ -18,7 +18,7 @@ "bcrypt": "^5.1.1", "clsx": "^2.0.0", "next": "13.5.5-canary.4", - "next-auth": "0.0.0-manual.c8300b61", + "next-auth": "0.0.0-manual.dacbe24d", "postcss": "8.4.31", "react": "18.2.0", "react-dom": "18.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d2f049..1082197 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -244,8 +244,8 @@ importers: specifier: 13.5.5-canary.4 version: 13.5.5-canary.4(@babel/core@7.23.0)(react-dom@18.2.0)(react@18.2.0) next-auth: - specifier: 0.0.0-manual.c8300b61 - version: 0.0.0-manual.c8300b61(next@13.5.5-canary.4)(react@18.2.0) + specifier: 0.0.0-manual.dacbe24d + version: 0.0.0-manual.dacbe24d(next@13.5.5-canary.4)(react@18.2.0) postcss: specifier: 8.4.31 version: 8.4.31 @@ -3829,8 +3829,8 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /next-auth@0.0.0-manual.c8300b61(next@13.5.5-canary.4)(react@18.2.0): - resolution: {integrity: sha512-0UW3ahzwqOc/H2OZ60JPUNQju+jIQSEy9SGL1Jehq+AixnNlWiTrTSEzLTtNx0O9LX3hGKWlnIAfYO2gVWx7dQ==} + /next-auth@0.0.0-manual.dacbe24d(next@13.5.5-canary.4)(react@18.2.0): + resolution: {integrity: sha512-Pu+w2mjcmN7PgmM6GvcMWLirB88n6BR5/ak/J4BOQ7IK0sXogpPMn58X38YOBd1utTNNrXAIxdilWMi7zuQE4Q==} peerDependencies: next: ^13.5.3 nodemailer: ^6.6.5