Awesome-omni-skill better-auth-best-practices
Better Auth(TypeScript 認証フレームワーク)の統合ガイド。セットアップ、セッション管理、プラグイン、セキュリティ設定に精通。
install
source · Clone the upstream repo
git clone https://github.com/diegosouzapw/awesome-omni-skill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/testing-security/better-auth-best-practices-nisshi-dev" ~/.claude/skills/diegosouzapw-awesome-omni-skill-better-auth-best-practices-842a0e && rm -rf "$T"
manifest:
skills/testing-security/better-auth-best-practices-nisshi-dev/SKILL.mdsource content
Better Auth 統合ガイド
コード例と最新 API は better-auth.com/docs を必ず参照すること。
Better Auth は TypeScript ファーストでフレームワーク非依存の認証フレームワーク。メール/パスワード、OAuth、マジックリンク、パスキーなどをプラグインでサポート。
クイックリファレンス
環境変数
- 暗号化シークレット(最低 32 文字)。生成:BETTER_AUTH_SECRETopenssl rand -base64 32
- ベース URL(例:BETTER_AUTH_URL
)https://example.com
環境変数が設定されていない場合のみ、config で
baseURL/secret を定義する。
ファイルの配置場所
CLI は
auth.ts を以下の順で検索: ./, ./lib, ./utils, または ./src 配下。カスタムパスは --config で指定。
CLI コマンド
- スキーマ適用(組み込みアダプター)npx @better-auth/cli@latest migrate
- Prisma/Drizzle 用スキーマ生成npx @better-auth/cli@latest generate
- AI ツールに MCP を追加npx @better-auth/cli mcp --cursor
プラグインの追加・変更後は必ず再実行すること。
コア設定オプション
| オプション | 説明 |
|---|---|
| 表示名(任意) |
| 未設定時のみ |
| デフォルト 。ルートに配置する場合は |
| 未設定時のみ |
| ほとんどの機能で必須。アダプタードキュメント参照 |
| セッション・レート制限用の Redis/KV |
| で有効化 |
| |
| プラグインの配列 |
| CSRF ホワイトリスト |
データベース
直接接続:
pg.Pool、mysql2 プール、better-sqlite3、または bun:sqlite インスタンスを渡す。
ORM アダプター:
better-auth/adapters/drizzle、better-auth/adapters/prisma、better-auth/adapters/mongodb からインポート。
重要: Better Auth はアダプターのモデル名を使用し、DB のテーブル名は使わない。Prisma モデルが
User でテーブルが users にマッピングされている場合、modelName: "user"(Prisma の参照名)を使い、"users" ではない。
セッション管理
ストレージの優先順位:
が定義されている場合 → セッションはそこに保存(DB ではない)secondaryStorage- DB にも永続化する場合は
を設定session.storeSessionInDatabase: true - DB なし +
→ 完全ステートレスモードcookieCache
Cookie キャッシュ戦略:
(デフォルト)- Base64url + HMAC。最小サイズcompact
- 標準 JWT。読み取り可能だが署名付きjwt
- 暗号化。最大セキュリティjwe
主要オプション:
session.expiresIn(デフォルト 7 日)、session.updateAge(リフレッシュ間隔)、session.cookieCache.maxAge、session.cookieCache.version(変更するとすべてのセッションを無効化)。
ユーザーとアカウント設定
ユーザー:
user.modelName、user.fields(カラムマッピング)、user.additionalFields、user.changeEmail.enabled(デフォルト無効)、user.deleteUser.enabled(デフォルト無効)。
アカウント:
account.modelName、account.accountLinking.enabled、account.storeAccountCookie(ステートレス OAuth 用)。
登録に必須:
email と name フィールド。
メールフロー
- 認証を機能させるには定義が必須emailVerification.sendVerificationEmail
/emailVerification.sendOnSignUp
- 自動送信トリガーsendOnSignIn
- パスワードリセットメールハンドラーemailAndPassword.sendResetPassword
セキュリティ
内:advanced
- HTTPS Cookie を強制useSecureCookies
- セキュリティリスクありdisableCSRFCheck
- セキュリティリスクありdisableOriginCheck
- サブドメイン間で Cookie を共有crossSubDomainCookies.enabled
- プロキシ用カスタム IP ヘッダーipAddress.ipAddressHeaders
- カスタム ID 生成、またはdatabase.generateId
/"serial"
/"uuid"false
レート制限:
rateLimit.enabled、rateLimit.window、rateLimit.max、rateLimit.storage("memory" | "database" | "secondary-storage")。
フック
エンドポイントフック:
hooks.before / hooks.after - { matcher, handler } の配列。createAuthMiddleware を使用。ctx.path、ctx.context.returned(after)、ctx.context.session にアクセス可能。
データベースフック:
databaseHooks.user.create.before/after、session、account も同様。デフォルト値の追加や作成後のアクションに有用。
フックコンテキスト (
): ctx.context
session、secret、authCookies、password.hash()/verify()、adapter、internalAdapter、generateId()、tables、baseURL。
プラグイン
ツリーシェイキングのため専用パスからインポート:
import { twoFactor } from "better-auth/plugins/two-factor"
from "better-auth/plugins" からはインポートしない。
主要プラグイン:
twoFactor、organization、passkey、magicLink、emailOtp、username、phoneNumber、admin、apiKey、bearer、jwt、multiSession、sso、oauthProvider、oidcProvider、openAPI、genericOAuth。
クライアントプラグインは
createAuthClient({ plugins: [...] }) に配置。
クライアント
インポート元:
better-auth/client(バニラ)、better-auth/react、better-auth/vue、better-auth/svelte、better-auth/solid。
主要メソッド:
signUp.email()、signIn.email()、signIn.social()、signOut()、useSession()、getSession()、revokeSession()、revokeSessions()。
型安全性
型の推論:
typeof auth.$Infer.Session、typeof auth.$Infer.Session.user。
クライアント/サーバーが別プロジェクトの場合:
createAuthClient<typeof auth>()。
よくあるハマりどころ
- モデル名 vs テーブル名 - 設定では ORM のモデル名を使用し、DB のテーブル名は使わない
- プラグインのスキーマ - プラグイン追加後に CLI を再実行する
- セカンダリストレージ - セッションはデフォルトでそちらに保存され、DB には保存されない
- Cookie キャッシュ - カスタムセッションフィールドはキャッシュされず、常に再取得される
- ステートレスモード - DB なし = セッションは Cookie のみ、キャッシュ期限でログアウト
- メールアドレス変更フロー - まず現在のメールに送信、その後新しいメールに送信