機能:サインインと認証メール
Googleサインインを、Google Cloudなしで。
アプリを使う人は、「Googleで続行」またはメールでサインインできます。Google CloudプロジェクトもOAuthクライアントもキーも不要です。新規登録のメールはアプリの名前で送られ、ドメインの確認が済むと、送信元は自分のドメインになります。
エージェントが呼び出すツール
appAuthConfigureappAuthStatusappAuthEmailConnectappAuthEmailStatus
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サインインの仕組み
Googleとやり取りするのはTofu。 アプリはやり取りしなくて済みます。
Tofuの中継サービスはoauth.trytofu.aiにあり、Googleクライアントと固定のコールバックアドレスを1つずつ持っています。あなたのアプリはブラウザをそこへ送るだけです。あとは中継サービスが、ユーザーをアプリ自身の認証サービスにサインインさせます。認証サービスは、アプリのマネージドデータベースの裏側で動くSupabaseプロジェクトです。
- あなたのアプリ「Googleで続行」を押すと、ブラウザがTofuの中継サービスへ移動します。
- oauth.trytofu.ai戻り先のアドレスがあなたのアプリのものかどうかだけを確認します。それ以外は何もしません。
- GoogleユーザーはGoogleの同意画面で、Tofuのクライアントを通してサインインします。
- あなたのアプリの認証サービスそこでアカウントが新しく作られるか、すでにあるアカウントが見つかります。ブラウザはサインインした状態でアプリに戻ります。
あなたのアプリ側には、GoogleのクラウドプロジェクトもOAuthクライアントもキーも要りません。アプリごとにGoogleのクラウドコンソールで設定する手間も、誰にもかかりません。Googleとやり取りするのは中継サービスだけだからです。
appAuthConfigureは、1回承認するだけで、Googleサインインとメールサインインの設定をアプリの認証サービスに書き込みます。そのあと設定を読み直して確かめてから、設定済み(configured)と答えます。
データベース付きでデプロイしても、それだけではサインインは有効になりません。デプロイ後に、改めて1回呼び出す必要があります。何度繰り返しても安全です。
// Continue with Google — Tofu brokers the sign-in.
window.location.href = process.env.NEXT_PUBLIC_TOFU_SIGN_IN_URL + "?return=" +
encodeURIComponent(window.location.href);&flow=pkceを付け、小さな専用ルートでサインインを完了させます。どちらもあなたのエージェントが書きます。新規登録メールの差出人。あなたのアプリの名前です。
メールサインインも同じ1回の設定で有効になります。Googleなどの外部サービスでのサインインがいつ使えなくなっても、アカウントに入り直す手段は必ず残ります。
アプリ自身の認証サービスは、Tofuが用意したメール送信の仕組みを通して、メール(confirmation、magic-link、password-reset、invitation、address-change、reauthentication)を送ります。差出人にはアプリの名前が表示されます。SMTPパスワードも、契約や登録が必要なメール配信サービスもありません。
どのメールにも、リンクに加えて1回だけ使えるコードが入っています。メールのセキュリティスキャン(ウイルス対策など)がリンクを先に開いて、ユーザーが使う前にトークンを消費してしまうからです。
| いつ | 送信元アドレス |
|---|---|
| ドメインの確認が済むまで | noreply@notify.trytofu.app |
| ドメインの確認が済んだら | noreply@send.frankskitchen.com |
自分のドメインから送信
DNSレコードは6件。 ドメインそのものには1件もありません。
ドメインを接続すると、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 10 | bounce.send | feedback-smtp.‹region›.amazonses.com |
| TXT | bounce.send | v=spf1 include:amazonses.com ~all |
| TXT | _dmarc.send | v=DMARC1; p=none; rua=mailto:… |
ドメインを接続したときにCloudflareで承認済みなら、Tofuがレコードを書き込みます。2度目の承認は不要です。承認がない場合は、追加するレコードを一覧で示し、メール配信サービスにドメインの確認を依頼します。
メール配信サービスがドメインを確認済みと報告するまで、メールはnotify.trytofu.appから送られ続けます。待っている間も、新規登録は止まりません。
メールスキャナーが開いても、リンクは無効になりません。
メールのリンクはどれも、アプリ自身のアドレスにある/auth/confirmを指します。トークンが消費されるのは、アプリがverifyOtpを呼び出したときだけです。そのため、リンクを先に開いたスキャナーがたどり着くのは、認証サービスではなく、あなたのアプリです。
/tofuスキルで新しく作ったアプリには、エージェントがこのルートを書き込みます。このルートなしでデプロイされたアプリでも、ユーザーは各メールに書かれたコードでサインインできます。
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`);
}近日対応
同意画面に出るのはTofuの名前です。 Googleは、サインインに使うTofuのクライアントについて、確認済みのアプリ名を表示します。そのため、ユーザーには「Tofuに続行」と表示されます。そこに自分のアプリ名を出すには、自分のGoogleクライアントが必要です。この仕組みはまだありません。
Tofuのマネージドデータベースでのみ使えます。 Tofuは、アプリのマネージドデータベースが持つ認証サービスに、サインインの設定を書き込みます。Clerk、Auth0、自分のSupabaseプロジェクトを使っているアプリには、何も変更を加えません。
Googleとメールだけです。 アプリのユーザーは、GitHubやAppleでサインインできません。
認証メールだけ。アプリのほかのメールは送りません。 Tofuが送るのは、サインインと新規登録のメールです。領収書や通知など、アプリが送るほかのメールはTofuを通りません。
自分の送信元を使うには、自分のドメインが必要です。 先にドメインをアプリに接続する必要があります。ドメインの認証が済むまでは、メールはnoreply@notify.trytofu.appから届きます。
自分のドメインからの送信は、いちばん新しい部分です。 Tofu自身のテストプロジェクトでは、DNSレコードの追加からドメインの認証、送信元の切り替えまで、一通り動作を確認済みです。ほかの人のアプリでは、まだ確認していません。
作りたいアプリを言葉で伝えるか、エージェントが作ったアプリを持ち込むだけ。Tofuがオンラインにします。
どのコーディングエージェントでも使えます
© 2026 Tofu
trytofu.ai
英語版からの翻訳です。内容に違いがある場合は、英語の原文が優先されます。