功能 · 登录与邮件

Google不用碰 Google Cloud

用户可以用 Google 或邮箱​登录你的 app。​你不用建 Google Cloud 项目,​不用配 OAuth 客户端,​也不用管​密钥。​注册​邮件的发​件人显示 app 的名字,​等域名​验证​通过,​就从你​自己的域名​发出。

查看文档交给 agent 设置

你的 agent 会调用的工具

  • appAuthConfigure
  • appAuthStatus
  • appAuthEmailConnect
  • appAuthEmailStatus
claude · ~/franks-kitchen示例

Let staff sign in with Google

Update(app/login/page.tsx)

1 line · Google button → TOFU_SIGN_IN_URL

Write(app/auth/confirm/route.ts)

new route · verifyOtp for the email link

tofu · appAuthConfigure confirmed: true

configured · Google sign-in, and email sign-in as well

Google 登录的工作原理

Tofu 来和 Google ​打交道, 你的 app 就不用了

Tofu 的中转​服务 oauth.trytofu.ai 自带一个 Google OAuth 客户端​和一个固定的回​调地址。​你的 app 让用户跳​转到中转​服务,​中转服务​再帮他们​登录 app 自己的认证​服务。​这个认证​服务,​就是托管​数据库​背后的 Supabase 项目。

邮件

注册和登录​邮件,用你 app 的名字发出

邮箱​登录会和 Google 登录​一起开启。​这样就算​哪天 Google 这类​第三方​登录​用不了,​用户​也总能用邮箱​登回​自己的账号。

你 app 自己的登录​服务会发​这几类​邮件(confirmation、magic-link、password-reset、invitation、address-change 和 reauthentication),​用的是 Tofu 配好的​发信​设置,​发件人​显示为你 app 的名字。​不用 SMTP 密码,​也不用另外​注册邮件​服务商。

每封邮件​除了链接,​还附带​一个一次性​验证码。​有些​邮箱的​安全扫描​会抢先点​开链接,​把里面的 token 用掉,​用户再点​就晚了。

用你的域名​发邮件

6 条 DNS 记录, 一条都不在你的主​域名上

域名​连好后,appAuthEmailConnect 会把 send.frankskitchen.com 设为发件​域名,​并添加​对应的 DNS 记录。​这些记录都在 send. 这个子​域名下,​完全​不影响​你域名​原有的​收信​设置。​删掉​这些记录,​域名​就恢复​原样。

类型名称(不含 frankskitchen.com)值
CNAME‹token 1›._domainkey.send‹token 1›.dkim.amazonses.com
CNAME‹token 2›._domainkey.send‹token 2›.dkim.amazonses.com
CNAME‹token 3›._domainkey.send‹token 3›.dkim.amazonses.com
MX 10bounce.sendfeedback-smtp.‹region›.amazonses.com
TXTbounce.sendv=spf1 include:amazonses.com ~all
TXT_dmarc.sendv=DMARC1; p=none; rua=mailto:…

如果连接​域名时,​你已经在 Cloudflare 上授权过 Tofu,​这些记录​会自动​写好,​不用再授权​一次。​其他​情况下,Tofu 会列出​要添加的​记录,​等你​加好,​再请邮件​服务商​验证。

域名​在邮件​服务商​那里​通过验证​之前,​邮件​照常从 notify.trytofu.app 发出,​用户注册​和登录​都不受​影响。

你的 app 只负责​这一条路由

邮件扫描器​先点开,登录链接​也不会失效

每封邮件里的​链接​都指向你的 app 自己的 /auth/confirm。​只有 app 调用了 verifyOtp,token 才会用掉。​所以邮件​扫描器​就算抢先​点开,​访问的也只是你的 app,​碰不到​登录​服务,​链接照样​能用。

用 /tofu skill 新做的 app,​你的 agent 会写好​这条路由。​如果 app 部署时​没有这条​路由,​用户照样​能输入​邮件里的​验证码​登录。

app/auth/confirm/route.tsnext.js
import { createClient } from '@/lib/supabase/server';
import { NextResponse } from 'next/server';

export async function GET(request) {
  const { searchParams, origin } = new URL(request.url);
  const token_hash = searchParams.get('token_hash');
  const type = searchParams.get('type');
  if (token_hash && type) {
    const supabase = await createClient();
    const { error } =
      await supabase.auth.verifyOtp({ type, token_hash });
    if (!error) return NextResponse.redirect(`${origin}/`);
  }
  return NextResponse.redirect(`${origin}/login?error=link`);
}

还没做到的,​很快会补上

  • Google 授权页上​显示的是 Tofu 的名字。 登录走​的是 Tofu 的 Google 客户端,Google 会显示​它经过​验证的​名字,​所以用户​看到的是​“继续​前往 Tofu”。​要换成你​自己的名字,​得用你自己的 Google 客户端,​这个功能​还没做。

  • 只能搭配 Tofu 托管数据库。 Tofu 会把登录​设置写进​托管​数据库​自带的​登录​服务。​如果你的 app 用的是 Clerk、Auth0,​或者你自己的 Supabase 项目,Tofu 不会做​任何改动。

  • 只支持 Google 和邮箱登录。 你的 app 用户不能用 GitHub 或 Apple 登录。

  • 只管登录邮件,​不管 app 的其他邮件。 Tofu 发登录​和注册​邮件。​收据、​通知和 app 发的其他​邮件,​都不经过 Tofu。

  • 想用自己的发​件地址,​得有​自己的域名。 域名​要先连接到 app。​域名验证​通过之前,​邮件还是从 noreply@notify.trytofu.app 发出。

  • 用自己的域名​发件,​是最新加的​功能。 添加 DNS 记录、​验证​域名、​切换发件​地址,​这一整套​流程已经在 Tofu 自己的测试​项目上​完整跑通,​但还没在其他​人的 app 上用过。

粘贴​一段提示词。10 分钟上线

用你​已经在用的 agent,10 分钟,​把 app、​数据库、​域名和​登录​都弄好。

免费开始