One Tap

One Tap插件允许用户使用Google的One Tap API通过单次点击完成登录。该插件提供了一种将One Tap集成到您的应用程序的简单方法,为您处理客户端和服务器端的逻辑。

安装

添加服务器插件

将One Tap插件添加到您的auth配置中:

auth.ts
import { betterAuth } from "better-auth";
import { oneTap } from "better-auth/plugins";
 
export const auth = betterAuth({
  plugins: [
    oneTap(), // 添加One Tap服务器插件
  ]
});

添加客户端插件

添加客户端插件并指定用户在登录后或需要额外验证(如2FA)时应该被重定向到哪里。

import { createAuthClient } from "better-auth/client";
import { oneTapClient } from "better-auth/client/plugins";
 
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弹窗,只需在您的auth客户端上调用oneTap方法:

await authClient.oneTap();

自定义重定向行为

默认情况下,成功登录后,插件将用户硬重定向到/。您可以按照以下方式自定义此行为:

避免硬重定向

传递带有onSuccess回调的fetchOptions来处理登录响应,而不进行页面重新加载:

authClient.oneTap({
  fetchOptions: {
    onSuccess: () => {
      // 例如,使用路由器进行导航,而不是完全重新加载:
      router.push("/dashboard");
    }
  }
});

指定自定义回调URL

要在登录后执行到不同页面的硬重定向,请使用callbackURL选项:

authClient.oneTap({
  callbackURL: "/dashboard"
});

使用指数退避处理提示关闭

如果用户关闭或跳过提示,插件将根据您配置的promptOptions使用指数退避重试显示One Tap提示。

如果在没有成功登录的情况下达到最大尝试次数,您可以使用onPromptNotification回调来接收通知——允许您渲染替代UI(例如,传统的Google登录按钮),以便用户可以手动重新启动该过程:

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的initialize方法的额外选项。
  • promptOptions:提示行为和指数退避的配置:
    • baseDelay:重试的基础延迟(毫秒)。默认为1000。
    • maxAttempts:调用onPromptNotification回调前的最大提示尝试次数。默认为5。

服务器选项

  • disableSignUp:禁用注册选项,只允许现有用户登录。默认为false
  • ClientId:如果在您的社交提供商配置中未提供,可以在此处选择性地传递客户端ID。

On this page