70 lines
1.7 KiB
TypeScript
70 lines
1.7 KiB
TypeScript
import NextAuth from "next-auth";
|
|
import authConfig from '@/auth.config';
|
|
import { PrismaClient } from '@/prisma/generated/client';
|
|
|
|
import { getUserById, genUsername } from "./helpers/user";
|
|
import { Role } from "@/config/enum";
|
|
import db from "@/lib/db";
|
|
|
|
const prisma = new PrismaClient({
|
|
log: ["error"],
|
|
});
|
|
|
|
export const { auth, handlers, signIn, signOut } = NextAuth({
|
|
// adapter: PrismaAdapter(prisma),
|
|
callbacks: {
|
|
async signIn({ user, account }) {
|
|
// Allow OAuth without email verification
|
|
if (account?.provider !== 'credentials') return true;
|
|
|
|
if (!user.id) throw new Error('User not found');
|
|
const existingUser = await getUserById(user.id);
|
|
|
|
if (!existingUser?.emailVerified) return false;
|
|
|
|
return true;
|
|
},
|
|
async session({ token, session }) {
|
|
// console.log("session", session, "token", token);
|
|
if (token.sub && session.user) {
|
|
session.user.id = token.sub;
|
|
session.user.name = token.name;
|
|
}
|
|
|
|
if (token.role && session.user) {
|
|
session.user.role = token.role as Role;
|
|
}
|
|
|
|
return session;
|
|
},
|
|
async jwt({ token }) {
|
|
if (!token.sub) return token;
|
|
const existingUser = await getUserById(token.sub);
|
|
|
|
if (!existingUser) return token;
|
|
|
|
const name = await genUsername(
|
|
existingUser.givenName,
|
|
existingUser.familyName
|
|
);
|
|
|
|
if (existingUser) {
|
|
token.role = existingUser.role;
|
|
}
|
|
|
|
if (token.isNewUser && !existingUser.name) {
|
|
token.name = name;
|
|
} else {
|
|
token.name = existingUser.name;
|
|
}
|
|
|
|
console.log('token', token);
|
|
|
|
return token;
|
|
},
|
|
},
|
|
...authConfig,
|
|
secret: process.env.AUTH_SECRET,
|
|
debug: true,
|
|
});
|