export const {
handlers: { GET, POST },
auth,
signIn,
signOut,
} = NextAuth({
pages: {
signIn: "/auth/login",
error: "/auth/error",
},
events: {
async linkAccount({ user }) {
await updateUserEmailVerification(user.id as Id<"users">);
},
},
callbacks: {
async signIn({ user, account }) {
if (account?.provider !== "credentials") return true;
if (!user.email) return false;
const existingUser = await getUserByEmail(user.email);
if (!existingUser?.emailVerified) return false;
return true;
},
async session({ session }) {
console.log(session);
const privateKey = await importPKCS8(
process.env.CONVEX_AUTH_PRIVATE_KEY!,
"RS256"
);
const convexToken = await new SignJWT({
sub: session.userId,
})
.setProtectedHeader({ alg: "RS256" })
.setIssuedAt()
.setIssuer(CONVEX_SITE_URL)
.setAudience("convex")
.setExpirationTime("1h")
.sign(privateKey);
return { ...session, convexToken };
},
},
adapter: ConvexAdapter,
...authConfig,
});
declare module "next-auth" {
interface Session {
convexToken: string;
}
}
export const {
handlers: { GET, POST },
auth,
signIn,
signOut,
} = NextAuth({
pages: {
signIn: "/auth/login",
error: "/auth/error",
},
events: {
async linkAccount({ user }) {
await updateUserEmailVerification(user.id as Id<"users">);
},
},
callbacks: {
async signIn({ user, account }) {
if (account?.provider !== "credentials") return true;
if (!user.email) return false;
const existingUser = await getUserByEmail(user.email);
if (!existingUser?.emailVerified) return false;
return true;
},
async session({ session }) {
console.log(session);
const privateKey = await importPKCS8(
process.env.CONVEX_AUTH_PRIVATE_KEY!,
"RS256"
);
const convexToken = await new SignJWT({
sub: session.userId,
})
.setProtectedHeader({ alg: "RS256" })
.setIssuedAt()
.setIssuer(CONVEX_SITE_URL)
.setAudience("convex")
.setExpirationTime("1h")
.sign(privateKey);
return { ...session, convexToken };
},
},
adapter: ConvexAdapter,
...authConfig,
});
declare module "next-auth" {
interface Session {
convexToken: string;
}
}