Spaces:
Sleeping
Sleeping
| import NextAuth from "next-auth"; | |
| import Credentials from "next-auth/providers/credentials"; | |
| import { compareSync } from "bcryptjs"; | |
| import { db } from "./db"; | |
| import { eq } from "drizzle-orm"; | |
| import { users } from "./db/schema"; | |
| export const { handlers, signIn, signOut, auth } = NextAuth({ | |
| cookies: { | |
| sessionToken: { | |
| name: "__Secure-authjs.session-token", | |
| options: { | |
| httpOnly: true, | |
| sameSite: "none", | |
| path: "/", | |
| secure: true, | |
| }, | |
| }, | |
| csrfToken: { | |
| name: "__Host-authjs.csrf-token", | |
| options: { | |
| httpOnly: true, | |
| sameSite: "none", | |
| path: "/", | |
| secure: true, | |
| }, | |
| }, | |
| callbackUrl: { | |
| name: "__Secure-authjs.callback-url", | |
| options: { | |
| httpOnly: true, | |
| sameSite: "none", | |
| path: "/", | |
| secure: true, | |
| }, | |
| }, | |
| }, | |
| providers: [ | |
| Credentials({ | |
| credentials: { | |
| email: { label: "Email", type: "email" }, | |
| password: { label: "Password", type: "password" }, | |
| }, | |
| async authorize(credentials) { | |
| const email = credentials?.email as string; | |
| const password = credentials?.password as string; | |
| if (!email || !password) return null; | |
| const user = db | |
| .select() | |
| .from(users) | |
| .where(eq(users.email, email)) | |
| .get(); | |
| if (!user) return null; | |
| if (!compareSync(password, user.passwordHash)) return null; | |
| return { id: String(user.id), email: user.email, name: user.name }; | |
| }, | |
| }), | |
| ], | |
| pages: { | |
| signIn: "/login", | |
| }, | |
| session: { strategy: "jwt" }, | |
| callbacks: { | |
| async jwt({ token, user }) { | |
| if (user) { | |
| token.id = user.id; | |
| } | |
| return token; | |
| }, | |
| async session({ session, token }) { | |
| if (session.user && token.id) { | |
| session.user.id = token.id as string; | |
| } | |
| return session; | |
| }, | |
| }, | |
| }); | |