import { betterAuth } from "better-auth";
import { prismaAdapter } from "better-auth/adapters/prisma";
import { db } from "./db";
import { nextCookies } from "better-auth/next-js";
import { sendEmail } from "@/actions/send-email";
import { twoFactor } from "better-auth/plugins";
export const auth = betterAuth({
appName: "Better Auth",
database: prismaAdapter(db, {
provider: "postgresql",
}),
emailAndPassword: {
enabled: true,
requireEmailVerification: true,
sendResetPassword: async ({ user, url, token }) => {
const newToken = `reset-password:${token}`;
if (!user.emailVerified) {
const existingToken = await db.verification.findFirst({
where: {
identifier: newToken,
},
});
await db.verification.delete({
where: {
id: existingToken?.id,
},
});
throw new Error();
}
await sendEmail({
email: user.email,
subject: "Reset your password",
text: `Click the link to reset your password: ${url}`,
});
},
},
emailVerification: {
sendOnSignUp: true,
autoSignInAfterVerification: true,
sendVerificationEmail: async ({ user, url }) => {
await sendEmail({
email: user.email,
subject: "Verify your email address",
text: `Click the link to verify your email: ${url}`,
});
},
},
user: {
deleteUser: {
enabled: true,
},
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
},
},
plugins: [
twoFactor({
otpOptions: {
async sendOTP({ user, otp }) {
await sendEmail({
email: user.email,
subject: "2FA",
text: `Your OTP is ${otp}`,
});
},
},
skipVerificationOnEnable: true,
}),
nextCookies(),
],
});
import { betterAuth } from "better-auth";
import { prismaAdapter } from "better-auth/adapters/prisma";
import { db } from "./db";
import { nextCookies } from "better-auth/next-js";
import { sendEmail } from "@/actions/send-email";
import { twoFactor } from "better-auth/plugins";
export const auth = betterAuth({
appName: "Better Auth",
database: prismaAdapter(db, {
provider: "postgresql",
}),
emailAndPassword: {
enabled: true,
requireEmailVerification: true,
sendResetPassword: async ({ user, url, token }) => {
const newToken = `reset-password:${token}`;
if (!user.emailVerified) {
const existingToken = await db.verification.findFirst({
where: {
identifier: newToken,
},
});
await db.verification.delete({
where: {
id: existingToken?.id,
},
});
throw new Error();
}
await sendEmail({
email: user.email,
subject: "Reset your password",
text: `Click the link to reset your password: ${url}`,
});
},
},
emailVerification: {
sendOnSignUp: true,
autoSignInAfterVerification: true,
sendVerificationEmail: async ({ user, url }) => {
await sendEmail({
email: user.email,
subject: "Verify your email address",
text: `Click the link to verify your email: ${url}`,
});
},
},
user: {
deleteUser: {
enabled: true,
},
},
socialProviders: {
github: {
clientId: process.env.GITHUB_CLIENT_ID!,
clientSecret: process.env.GITHUB_CLIENT_SECRET!,
},
},
plugins: [
twoFactor({
otpOptions: {
async sendOTP({ user, otp }) {
await sendEmail({
email: user.email,
subject: "2FA",
text: `Your OTP is ${otp}`,
});
},
},
skipVerificationOnEnable: true,
}),
nextCookies(),
],
});