验证码
Captcha 插件通过为关键端点添加验证码验证,将机器人防护功能集成到您的 Better Auth 系统中。该插件确保只有真实用户才能执行注册、登录或重置密码等操作。目前支持以下提供商:
安装步骤
将插件添加到您的 auth 配置中
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: "user@example.com",
password: "secure-password",
fetchOptions: {
headers: {
"x-captcha-response": turnstileToken,
"x-captcha-user-remote-ip": userIp, // 可选:将用户的 IP 地址转发给验证码服务
},
},
});
- 要在客户端实现 Cloudflare Turnstile,请遵循官方的 Cloudflare Turnstile 文档 或使用像 react-turnstile 这样的库。
- 要在客户端实现 Google reCAPTCHA,请遵循官方的 Google reCAPTCHA 文档 或使用像 react-google-recaptcha (v2) 和 react-google-recaptcha-v3 (v3) 这样的库。
- 要在客户端实现 hCaptcha,请遵循官方的 hCaptcha 文档 或使用像 @hcaptcha/react-hcaptcha 这样的库。
工作原理
该插件作为中间件运行:它会拦截所有发送到已配置端点(参见插件选项中的 endpoints
)的 POST
请求。
通过调用验证码提供商的 /siteverify
接口,在服务器端验证验证码令牌。
- 如果令牌缺失、被验证码提供商拒绝,或者
/siteverify
端点不可用,插件将返回错误并中断请求。 - 如果令牌被验证码提供商接受,中间件将返回
undefined
,表示允许请求继续执行。
插件选项
provider
(必填):您的验证码提供商。secretKey
(必填):用于服务器端验证的提供商密钥。endpoints
(可选):覆盖默认需要验证码验证的路径数组。默认为:["/sign-up/email", "/sign-in/email", "/forget-password"]
。minScore
(可选 - 仅适用于 Google ReCAPTCHA v3):最低分数阈值。默认为0.5
。siteKey
(可选 - 仅适用于 hCaptcha):防止在一个站点密钥下颁发的令牌在其他地方被使用。siteVerifyURLOverride
(可选):覆盖验证码验证请求的端点 URL。