Status: Ready
概要
Better Auth のメールアドレス確認とパスワードリセットを有効化し、両機能で共有するトランザクションメール送信基盤を整備する。メールアドレスの所有を確認したユーザーだけがログインでき、パスワードを忘れたユーザーが Web から安全に再設定できるようにする。
背景 / モチベーション
- 現在はメールアドレスとパスワードで登録できるが、メールアドレスの所有確認を行っていない
- パスワードを忘れたユーザーが自力でアカウントへ戻る経路がない
- メールアドレス確認とパスワードリセットは、送信プロバイダー、メール送信処理、テンプレート、環境変数、失敗監視を共有するため、一つの認証メール基盤として実装する
- 配送要求が拒否された場合に「送信した」と断定すると、ユーザーが届かないメールを待ち続けるため、配送結果と画面表示を一致させる必要がある
- パスワード再設定では、応答内容だけでなく処理時間からもアカウントの登録有無を推測しにくくする必要がある
受け入れ条件
実装方針
- メール送信処理を認証設定から分離し、Resend クライアントとテスト用 sender を差し替えられる構成にする
- Resend の
emails.send が返す error も失敗として扱い、プロバイダーの詳細は保持・転送せず、設定不備・拒否・タイムアウト・到達不能・不明などの安全な分類へ変換する
- Cloud Run でリクエスト終了後の未保証な非同期処理に依存しないよう、プロバイダーによる受付を bounded timeout 内で確認してから応答する
- パスワード再設定要求は既知・未知アカウントで同じ応答にし、既知アカウントの配送処理にだけ現れる時間差を小さくするため最小応答時間を適用する
- Better Auth の確認・再設定 callback URL に対応する Web ルートを追加する
- 確認成功時は中間完了画面を挟まず、状態を表す検索パラメータ付きでログイン画面へ戻す。無効・期限切れ時だけ再送導線を持つエラー画面を表示する
- Mobile / CLI 専用の確認・再設定画面は追加せず、未確認時はメール内リンクまたは Web で続行できる案内を表示する
スコープ外
- メールアドレス変更フロー
- Mobile / CLI 専用のパスワード再設定 UI やディープリンク
- 二要素認証、パスキー、ソーシャルログイン、パスワードレス認証
- CAPTCHA / Turnstile などの bot 対策
- Better Auth のレート制限ストレージの DB / Redis への移行
- 独自の永続メールキューや自動リトライ基盤
- メールマガジンや通知メール
- バウンス・苦情 webhook の運用
参考
Status: Ready
概要
Better Auth のメールアドレス確認とパスワードリセットを有効化し、両機能で共有するトランザクションメール送信基盤を整備する。メールアドレスの所有を確認したユーザーだけがログインでき、パスワードを忘れたユーザーが Web から安全に再設定できるようにする。
背景 / モチベーション
受け入れ条件
emailVerification.sendVerificationEmail、sendOnSignUp、sendOnSignInとemailAndPassword.requireEmailVerificationを公式 API に沿って設定するRESEND_API_KEY、送信元アドレス、送信元名など必要な設定を.env.exampleと運用ドキュメントへ追加し、API キーは本番では Secret Manager から Cloud Run へ渡すpnpm db:seedで作成する固定テストユーザーは確認済みとしてログインできる実装方針
emails.sendが返すerrorも失敗として扱い、プロバイダーの詳細は保持・転送せず、設定不備・拒否・タイムアウト・到達不能・不明などの安全な分類へ変換するスコープ外
参考
apps/api/src/auth.tsapps/web/src/routes/login.tsx、apps/web/src/routes/signup.tsxapps/api/src/db/seed.ts