电子邮件

电子邮件是 Better Auth 的核心组成部分,无论用户使用何种认证方式,都必须提供电子邮件。Better Auth 提供了开箱即用的电子邮件和密码认证功能,以及许多实用工具来帮助您管理电子邮件验证、密码重置等功能。

电子邮件验证

电子邮件验证是一项安全功能,确保用户提供有效的电子邮件地址。通过确认电子邮件地址属于用户本人,有助于防止垃圾邮件和滥用行为。在本指南中,您将了解如何在应用中实现基于令牌的电子邮件验证。 如需使用基于 OTP 的电子邮件验证,请查看 OTP 验证 指南。

为应用添加电子邮件验证功能

要启用电子邮件验证,您需要传递一个发送包含验证链接的电子邮件的函数。

  • sendVerificationEmail: 此函数在电子邮件验证开始时触发。它接受一个包含以下属性的数据对象:
    • user: 包含电子邮件地址的用户对象
    • url: 用户必须点击以验证电子邮件的验证 URL
    • token: 用于完成电子邮件验证的验证令牌,可在实现自定义验证 URL 时使用

以及作为第二个参数的 request 对象。

auth.ts
import { betterAuth } from 'better-auth';
import { sendEmail } from './email'; // 您的邮件发送函数

export const auth = betterAuth({
    emailVerification: {
        sendVerificationEmail: async ({ user, url, token }, request) => {
            await sendEmail({
                to: user.email,
                subject: '验证您的电子邮件地址',
                text: `点击链接验证您的电子邮件:${url}`
            })
        }
    }
})

触发电子邮件验证

您可以通过以下几种方式发起电子邮件验证:

1. 注册时发送

要在注册时自动发送验证邮件,请将 emailVerification.sendOnSignUp 设置为 true

auth.ts
import { betterAuth } from 'better-auth';

export const auth = betterAuth({
    emailVerification: {
        sendOnSignUp: true
    }
})

这将在用户注册时发送验证邮件。对于社交登录,邮件验证状态将从 SSO 读取。

启用 sendOnSignUp 后,当用户使用未声明邮箱已验证的 SSO 登录时,Better Auth 会发送验证邮件,但即使启用了 requireEmailVerification,也不需要通过验证即可登录。

2. 要求邮箱验证

如果启用要求邮箱验证功能,用户必须先验证邮箱才能登录。每次用户尝试登录时,都会调用 sendVerificationEmail

这仅在您已实现 sendVerificationEmail 且用户尝试使用邮箱和密码登录时才有效。

auth.ts
export const auth = betterAuth({
    emailAndPassword: {
        requireEmailVerification: true
    }
})

如果用户尝试在未验证邮箱的情况下登录,您可以处理错误并向用户显示消息。

auth-client.ts
await authClient.signIn.email({
    email: "email@example.com",
    password: "password"
}, {
    onError: (ctx) => {
        // 处理错误
        if(ctx.error.status === 403) {
            alert("请验证您的邮箱地址")
        }
        // 您也可以显示原始错误消息
        alert(ctx.error.message)
    }
})

3. 手动触发

您也可以通过调用 sendVerificationEmail 手动触发邮箱验证。

await authClient.sendVerificationEmail({
    email: "user@email.com",
    callbackURL: "/" // 验证后的重定向 URL
})

邮箱验证

如果用户点击提供的验证链接,其邮箱将自动完成验证,并重定向至 callbackURL

如需手动验证,您可以向用户发送包含 token 的自定义链接,并调用 verifyEmail 函数。

await authClient.verifyEmail({
    query: {
        token: "" // 在此处传入 token
    }
})

验证后自动登录

若要在用户成功验证邮箱后自动登录,请将 autoSignInAfterVerification 选项设置为 true

const auth = betterAuth({
    //...其他配置项
    emailVerification: {
        autoSignInAfterVerification: true
    }
})

邮箱验证成功后的回调

您可以使用 afterEmailVerification 回调在用户验证邮箱后立即执行自定义代码。这对于触发一些副作用非常有用,例如授予特殊功能访问权限或记录事件。

当用户邮箱确认后,afterEmailVerification 函数会自动运行,接收 user 对象和 request 详细信息,以便您可以为该特定用户执行操作。

配置方式如下:

auth.ts
import { betterAuth } from 'better-auth';

export const auth = betterAuth({
    emailVerification: {
        async afterEmailVerification(user, request) {
            // 在此处添加自定义逻辑,例如授予高级功能访问权限
            console.log(`${user.email} 已成功验证!`);
        }
    }
})

密码重置邮件

密码重置功能允许用户在忘记密码时重新设置密码。Better Auth 提供了一种简单的方式来实现密码重置功能。

您可以通过传递一个发送包含重置链接的密码重置邮件的函数来启用此功能。

auth.ts
import { betterAuth } from 'better-auth';
import { sendEmail } from './email'; // 您的邮件发送函数

export const auth = betterAuth({
    emailAndPassword: {
        enabled: true,
        sendResetPassword: async ({ user, url, token }, request) => {
            await sendEmail({
                to: user.email,
                subject: '重置您的密码',
                text: `请点击链接重置密码:${url}`
            })
        }
    }
})

查看 邮箱和密码 指南,了解如何在您的应用中实现密码重置的更多细节。 您还可以查看 OTP 验证 指南,了解如何在您的应用中使用 OTP 实现密码重置。

On this page