电子邮件

电子邮件是 Better Auth 的关键部分,无论用户使用何种认证方法,所有用户都需要它。Better Auth 开箱即用地提供了电子邮件和密码认证,以及许多实用工具来帮助您管理电子邮件验证、密码重置等。

电子邮件验证

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

在您的应用中添加电子邮件验证

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

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

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

auth.ts
import { betterAuth } from 'better-auth';
import { sendEmail } from './email'; // your email sending function

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) => {
        // Handle the error
        if(ctx.error.status === 403) {
            alert("请验证您的电子邮件地址")
        }
        //you can also show the original error message
        alert(ctx.error.message)
    }
})

3. 手动

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

await authClient.sendVerificationEmail({
    email: "user@email.com",
    callbackURL: "/" // The redirect URL after verification
})

验证电子邮件

如果用户点击提供的验证 URL,他们的电子邮件将被自动验证,并重定向到 callbackURL

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

await authClient.verifyEmail({
    query: {
        token: "" // Pass the token here
    }
})

验证后自动登录

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

const auth = betterAuth({
    //...your other options
    emailVerification: {
        autoSignInAfterVerification: true
    }
})

电子邮件验证成功后的回调

您可以使用 afterEmailVerification 回调在用户验证其电子邮件后立即运行自定义代码。这对于您想要触发的任何副作用很有用,例如授予访问特殊功能或记录事件。

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

以下是设置方法:

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

export const auth = betterAuth({
    emailVerification: {
        async afterEmailVerification(user, request) {
            // Your custom logic here, e.g., grant access to premium features
            console.log(`${user.email} 已成功验证!`);
        }
    }
})

密码重置电子邮件

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

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

auth.ts
import { betterAuth } from 'better-auth';
import { sendEmail } from './email'; // your email sending function

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