File size: 2,641 Bytes
4e8eee4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import type { NextAuthConfig } from "next-auth";
import NextAuth from "next-auth";
import Credentials from "next-auth/providers/credentials";
import { PrismaAdapter } from "@auth/prisma-adapter";
import bcrypt from "bcryptjs";
import { Role } from "@prisma/client";
import prisma from "@/lib/db";
export const authOptions = {
adapter: PrismaAdapter(prisma),
session: { strategy: "jwt" },
pages: { signIn: "/login" },
providers: [
Credentials({
name: "Credenciais",
credentials: {
email: { label: "E-mail", type: "email" },
password: { label: "Senha", type: "password" },
},
async authorize(credentials) {
if (!credentials?.email || !credentials?.password) {
return null;
}
const user = await prisma.user.findUnique({
where: { email: credentials.email },
});
if (!user) {
return null;
}
const passwordMatch = await bcrypt.compare(
credentials.password,
user.passwordHash
);
if (!passwordMatch) {
return null;
}
const membership = await prisma.membership.findFirst({
where: { userId: user.id },
orderBy: { createdAt: "asc" },
});
return {
id: user.id,
email: user.email,
orgId: membership?.orgId ?? null,
role: membership?.role ?? null,
} satisfies {
id: string;
email: string;
orgId: string | null;
role: Role | null;
};
},
}),
],
callbacks: {
async jwt({ token, user }) {
if (user) {
token.userId = user.id;
token.orgId = (user as { orgId?: string | null }).orgId ?? null;
token.role = (user as { role?: Role | null }).role ?? null;
}
if (token.userId && (!token.orgId || !token.role)) {
const membership = await prisma.membership.findFirst({
where: { userId: token.userId as string },
orderBy: { createdAt: "asc" },
});
token.orgId = membership?.orgId ?? null;
token.role = membership?.role ?? null;
}
return token;
},
async session({ session, token }) {
if (session.user) {
session.user.id = token.userId as string;
session.user.orgId = (token.orgId as string | null) ?? null;
session.user.role = (token.role as Role | null) ?? null;
}
return session;
},
},
secret: process.env.AUTH_SECRET,
trustHost: true,
} satisfies NextAuthConfig;
export const { handlers, auth, signIn, signOut } = NextAuth(authOptions);
|