验证码

验证码插件通过为关键端点添加验证码验证,将机器人保护集成到你的Better Auth系统中。该插件确保只有人类用户才能执行注册、登录或重置密码等操作。目前支持以下提供商:

该插件可与电子邮件和密码认证开箱即用。要将其与其他认证方法一起使用,你需要在插件选项中配置endpoints数组。

安装

将插件添加到你的auth配置中

auth.ts
import { betterAuth } from "better-auth";
import { captcha } from "better-auth/plugins";
 
export const auth = betterAuth({
    plugins: [ 
        captcha({ 
            provider: "cloudflare-turnstile", // 或 google-recaptcha, hcaptcha
            secretKey: process.env.TURNSTILE_SECRET_KEY!, 
        }), 
    ], 
});

将验证码令牌添加到你的请求头中

为所有受保护的端点在请求头中添加验证码令牌。以下示例展示如何在signIn请求中包含它:

await authClient.signIn.email({
    email: "[email protected]",
    password: "secure-password",
    fetchOptions: { 
        headers: { 
            "x-captcha-response": turnstileToken, 
            "x-captcha-user-remote-ip": userIp, // 可选:将用户的IP地址转发给验证码服务
        }, 
    },
});

工作原理

该插件作为中间件运行:它拦截所有发送到配置端点的POST请求(参见插件选项部分中的endpoints)。

它通过调用验证码提供商的/siteverify在服务器上验证验证码令牌。

  • 如果令牌缺失、被验证码提供商拒绝,或者/siteverify端点不可用,插件将返回错误并中断请求。
  • 如果令牌被验证码提供商接受,中间件返回undefined,表示请求被允许继续。

插件选项

  • provider(必需):你的验证码提供商。
  • secretKey(必需):用于服务器端验证的提供商密钥。
  • endpoints(可选):覆盖默认的强制验证码验证的路径数组。默认值为:["/sign-up/email", "/sign-in/email", "/forget-password",]
  • minScore(可选 - 仅适用于Google ReCAPTCHA v3):最低分数阈值。默认值为0.5
  • siteKey(可选 - 仅适用于hCaptcha):防止在一个站点密钥上发行的令牌在其他地方被兑换。
  • siteVerifyURLOverride(可选):覆盖验证码验证请求的端点URL。

On this page