diff --git a/docs/content/docs/reference/options.mdx b/docs/content/docs/reference/options.mdx index eeb84a6305..21c43956ba 100644 --- a/docs/content/docs/reference/options.mdx +++ b/docs/content/docs/reference/options.mdx @@ -132,6 +132,7 @@ export const auth = betterAuth({ - `sendVerificationEmail`: Function to send verification email - `sendOnSignUp`: Send verification email automatically after sign up (default: `false`) +- `sendOnSignIn`: Send verification email automatically on sign in when the user's email is not verified (default: `false`) - `autoSignInAfterVerification`: Auto sign in the user after they verify their email - `expiresIn`: Number of seconds the verification token is valid for (default: `3600` seconds) diff --git a/packages/better-auth/src/api/routes/sign-in.ts b/packages/better-auth/src/api/routes/sign-in.ts index 7e66f1fc94..1a143d1346 100644 --- a/packages/better-auth/src/api/routes/sign-in.ts +++ b/packages/better-auth/src/api/routes/sign-in.ts @@ -502,23 +502,29 @@ export const signInEmail = createAuthEndpoint( message: BASE_ERROR_CODES.EMAIL_NOT_VERIFIED, }); } - const token = await createEmailVerificationToken( - ctx.context.secret, - user.user.email, - undefined, - ctx.context.options.emailVerification?.expiresIn, - ); - const url = `${ - ctx.context.baseURL - }/verify-email?token=${token}&callbackURL=${ctx.body.callbackURL || "/"}`; - await ctx.context.options.emailVerification.sendVerificationEmail( - { - user: user.user, - url, - token, - }, - ctx.request, - ); + + if (ctx.context.options?.emailVerification?.sendOnSignIn) { + const token = await createEmailVerificationToken( + ctx.context.secret, + user.user.email, + undefined, + ctx.context.options.emailVerification?.expiresIn, + ); + const url = `${ + ctx.context.baseURL + }/verify-email?token=${token}&callbackURL=${ + ctx.body.callbackURL || "/" + }`; + await ctx.context.options.emailVerification.sendVerificationEmail( + { + user: user.user, + url, + token, + }, + ctx.request, + ); + } + throw new APIError("FORBIDDEN", { message: BASE_ERROR_CODES.EMAIL_NOT_VERIFIED, }); diff --git a/packages/better-auth/src/types/options.ts b/packages/better-auth/src/types/options.ts index 9eb43a3630..ff911d286b 100644 --- a/packages/better-auth/src/types/options.ts +++ b/packages/better-auth/src/types/options.ts @@ -162,6 +162,13 @@ export type BetterAuthOptions = { * @default false */ sendOnSignUp?: boolean; + /** + * Send a verification email automatically + * on sign in when the user's email is not verified + * + * @default false + */ + sendOnSignIn?: boolean; /** * Auto signin the user after they verify their email */