一键登录
一键登录(One Tap)插件允许用户通过 Google 的 One Tap API 实现一键登录。该插件提供了一种简单的方式将 One Tap 集成到您的应用程序中,并为您处理客户端和服务器端的逻辑。
安装
添加服务器插件
在您的身份验证配置中添加 One Tap 插件:
import { betterAuth } from "better-auth";
import { oneTap } from "better-auth/plugins";
export const auth = betterAuth({
plugins: [
oneTap(), // 添加 One Tap 服务器插件
]
});添加客户端插件
添加客户端插件,并指定用户在登录后或需要额外验证(如双因素认证)时应被重定向的位置。
import { createAuthClient } from "better-auth/client";
import { oneTapClient } from "better-auth/client/plugins";
export const authClient = createAuthClient({
plugins: [
oneTapClient({
clientId: "YOUR_CLIENT_ID",
// 可选的客户端配置:
autoSelect: false,
cancelOnTapOutside: true,
context: "signin",
additionalOptions: {
// 用于 Google 初始化方法的任何额外选项
},
// 配置提示行为和指数退避策略:
promptOptions: {
baseDelay: 1000, // 基础延迟(毫秒,默认:1000)
maxAttempts: 5 // 触发 onPromptNotification 前的最大尝试次数(默认:5)
}
})
]
});使用方法
要显示 One Tap 弹窗,只需在您的身份验证客户端上调用 oneTap 方法:
await authClient.oneTap();自定义重定向行为
默认情况下,登录成功后插件会将用户硬重定向到 /。您可以按以下方式自定义此行为:
避免硬重定向
通过 fetchOptions 配置 onSuccess 回调来处理登录响应,无需页面重载:
await authClient.oneTap({
fetchOptions: {
onSuccess: () => {
// 例如:使用路由进行跳转而非完全重载:
router.push("/dashboard");
}
}
});指定自定义回调 URL
若需在登录后硬重定向到其他页面,可使用 callbackURL 选项:
await authClient.oneTap({
callbackURL: "/dashboard"
});使用指数退避策略处理提示框关闭
如果用户关闭或跳过提示框,插件将根据您配置的 promptOptions 使用指数退避策略重试显示 One Tap 提示。
如果达到最大尝试次数仍未成功登录,您可以使用 onPromptNotification 回调接收通知——从而可以渲染替代 UI(例如传统的 Google 登录按钮),让用户能够手动重新启动流程:
await authClient.oneTap({
onPromptNotification: (notification) => {
console.warn("提示框已被关闭或跳过。建议显示替代登录选项。", notification);
// 在此处渲染您的替代 UI
}
});客户端选项
- clientId: 您的 Google One Tap API 客户端 ID。
- autoSelect: 如果用户已登录,则自动选择账户。默认为 false。
- context: 使用 One Tap API 的上下文(例如 "signin")。默认为 "signin"。
- cancelOnTapOutside: 当用户点击外部区域时取消 One Tap 弹窗。默认为 true。
- additionalOptions: 根据 Google Identity Services 文档 传递给 Google 初始化方法的额外选项。
- promptOptions: 提示行为和指数退避配置:
- baseDelay: 重试的基础延迟时间(毫秒)。默认为 1000。
- maxAttempts: 在调用 onPromptNotification 回调前的最大提示尝试次数。默认为 5。
服务器选项
- disableSignUp: 禁用注册选项,仅允许现有用户登录。默认为
false。 - ClientId: 如果您的社交提供商配置中未提供客户端 ID,可在此处传递。