mcpField
B
better-auth

better-auth

github.com/marcioaltoeセキュリティ057 回インストール1 日前に更新
リポジトリ

better-auth について

複数のフレームワークに対応する TypeScript 認証ライブラリで、プラグイン方式を採用しています。多様な認証方式とデータベースアダプターに対応し、各フレームワーク向けのクライアントとサーバー連携を提供します。

主な機能

  1. 01メールとソーシャル認証
  2. 02パスキー、OTP、マジックリンク
  3. 03プラグインによる認証機能の拡張
  4. 04フレームワーク別のクライアントとサーバー設定
  5. 05複数のデータベースアダプター
  6. 06セッションとセキュリティの設定

活用シーン

  1. 01TypeScript アプリへの認証追加
  2. 02パスキーまたは二要素認証の有効化
  3. 03組織のロールとチームの設定
  4. 04複数フレームワークでのセッション設定

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/marcioaltoe/skills --skill better-auth

インストール後、Claude Code で/better-authを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
references/
admin.md
authentication.md
framework-integrations.md
hooks-and-middleware.md
organizations.md
plugins.md
security.md
sessions.md
setup.md
two-factor.md

詳細

Better Auth

フレームワークに依存しない TypeScript 認証ライブラリです。プラグインベースのアーキテクチャ、40 以上の OAuth プロバイダー、18 以上のフレームワーク連携に対応しています。

クイックスタート

インストール
npm install better-auth

必要に応じてスコープ付きパッケージを使用します。

パッケージ用途
@better-auth/passkeyWebAuthn/Passkey 認証
@better-auth/ssoSAML/OIDC エンタープライズ SSO
@better-auth/stripeStripe 決済
@better-auth/expoReact Native/Expo
環境変数
BETTER_AUTH_SECRET=<32+ chars, generate: openssl rand -base64 32>
BETTER_AUTH_URL=http://localhost:3000
DATABASE_URL=<connection string>
サーバー設定(lib/auth.ts)
import { betterAuth } from "better-auth";

export const auth = betterAuth({
  database: process.env.DATABASE_URL,  // or adapter instance
  emailAndPassword: { enabled: true },
  socialProviders: {
    google: {
      clientId: process.env.GOOGLE_CLIENT_ID!,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
    },
  },
  plugins: [], // add plugins here
});

export type Session = typeof auth.$Infer.Session;
クライアント設定(lib/auth-client.ts)
import { createAuthClient } from "better-auth/react"; // or /vue, /svelte, /solid, /client

export const authClient = createAuthClient({
  plugins: [], // add client plugins here
});
ルートハンドラー
フレームワークファイルハンドラー
Next.js App Routerapp/api/auth/[...all]/route.tstoNextJsHandler(auth)`` → { GET, POST }` をエクスポート
Next.js Pagespages/api/auth/[...all].tstoNextJsHandler(auth) → デフォルトエクスポート
Express任意app.all("/api/auth/*splat", toNodeHandler(auth))
Honoルートapp.on(["POST","GET"], "/api/auth/**", (c) => auth.handler(c.req.raw))
SvelteKithooks.server.tssvelteKitHandler({ auth, event })
Astropages/api/auth/[...all].tstoAstroHandler(auth)
Elysiaプラグインnew Elysia().mount(auth.handler)

すべてのフレームワークについては、references/framework-integrations.md を参照してください。

CLI コマンド
npx @better-auth/cli@latest migrate          # Apply schema (built-in adapter)
npx @better-auth/cli@latest generate          # Generate for Prisma/Drizzle
npx @better-auth/cli@latest generate --output prisma/schema.prisma
npx @better-auth/cli@latest generate --output src/db/auth-schema.ts

プラグインを追加または変更した後は、再実行してください。

コアコンセプト

  • サーバーインスタンス(auth):すべての認証ロジック、DB、セッションを処理します
  • クライアントインスタンス(authClient):フレームワーク固有のフック(useSession、signIn、signUp、signOut)
  • プラグイン:サーバーとクライアントの両方を拡張し、エンドポイント、DB テーブル、フックを追加します
  • 型推論:auth.$Infer.Session、auth.$Infer.Session.user により、完全な型安全性を実現します
  • クライアントとサーバーが別々のプロジェクトの場合:createAuthClient<typeof auth>()

認証方式

方式パッケージ設定/プラグインリファレンス
メール/パスワード組み込みemailAndPassword: { enabled: true }authentication.md
ソーシャル OAuth組み込みsocialProviders: { google: {...} }authentication.md
マジックリンク組み込みmagicLink() プラグインauthentication.md
パスキー@better-auth/passkeypasskey() プラグインauthentication.md
ユーザー名組み込みusername() プラグインauthentication.md
メール OTP組み込みemailOtp() プラグインauthentication.md
電話番号組み込みphoneNumber() プラグインauthentication.md
匿名組み込みanonymous() プラグインauthentication.md

プラグインのクイックリファレンス

ツリーシェイキングのため、専用のパスからインポートしてください。import { twoFactor } from "better-auth/plugins/two-factor" を使用し、from "better-auth/plugins" は使用しないでください。

プラグインサーバーのインポートクライアントのインポート用途
twoFactorbetter-auth/plugins/two-factortwoFactorClientTOTP、OTP、バックアップコード
organizationbetter-auth/plugins/organizationorganizationClientマルチテナント組織、チーム、RBAC
adminbetter-auth/plugins/adminadminClientユーザー管理、なりすまし
passkey@better-auth/passkeypasskeyClientWebAuthn/FIDO2
magicLinkbetter-auth/plugins/magic-linkmagicLinkClientパスワード不要のメールリンク
emailOtpbetter-auth/plugins/email-otpemailOtpClientメールのワンタイムパスワード
usernamebetter-auth/plugins/usernameusernameClientユーザー名ベースの認証
phoneNumberbetter-auth/plugins/phone-numberphoneNumberClient電話番号ベースの認証
anonymousbetter-auth/plugins/anonymousanonymousClientゲストセッション
apiKeybetter-auth/plugins/api-keyapiKeyClientAPI キー管理
bearerbetter-auth/plugins/bearer—ベアラートークン認証
jwtbetter-auth/plugins/jwtjwtClientJWT トークン
multiSessionbetter-auth/plugins/multi-sessionmultiSessionClient複数のアクティブなセッション
oauthProviderbetter-auth/plugins/oauth-provider—OAuth プロバイダーになる
oidcProviderbetter-auth/plugins/oidc-provider—OIDC プロバイダーになる
sso@better-auth/ssossoClientSAML/OIDC エンタープライズ SSO
openAPIbetter-auth/plugins/open-api—API ドキュメント
customSessionbetter-auth/plugins/custom-session—セッションデータを拡張
genericOAuthbetter-auth/plugins/generic-oauthgenericOAuthClientカスタム OAuth プロバイダー
oneTapbetter-auth/plugins/one-taponeTapClientGoogle One Tap

パターン:auth({ plugins: [...] }) にサーバープラグインを追加し、createAuthClient({ plugins: [...] }) にクライアントプラグインを追加してから、CLI マイグレーションを再実行します。

詳細な使用方法とカスタムプラグインの作成については、references/plugins.md を参照してください。

データベースのセットアップ

アダプターセットアップ
SQLitebetter-sqlite3 または bun:sqlite のインスタンスを渡します
PostgreSQLpg.Pool のインスタンスを渡します
MySQLmysql2 のプールを渡します
Prismabetter-auth/adapters/prisma の prismaAdapter(prisma, { provider: "postgresql" })
Drizzlebetter-auth/adapters/drizzle の drizzleAdapter(db, { provider: "pg" })
MongoDBbetter-auth/adapters/mongodb の mongodbAdapter(db)
接続文字列database: process.env.DATABASE_URL(組み込みの Kysely を使用)

重要: 設定では DB テーブル名ではなく、ORM のモデル名を使用します。Prisma モデル User がテーブル users にマッピングされる場合は、modelName: "user" を使用します。

コアスキーマのテーブル:user、session、account、verification。プラグインは独自のテーブルを追加します。

データベースのセットアップの詳細については、references/setup.md を参照してください。

セッション管理

主なオプション:

session: {
  expiresIn: 60 * 60 * 24 * 7,  // 7 days (default)
  updateAge: 60 * 60 * 24,       // refresh every 24h (default)
  freshAge: 60 * 60 * 24,        // require re-auth after 24h for sensitive ops
  cookieCache: {
    enabled: true,
    maxAge: 300,                  // 5 min
    strategy: "compact",          // "compact" | "jwt" | "jwe"
  },
}
  • secondaryStorage(Redis/KV):セッションはデフォルトで DB ではなく、ここに保存されます
  • ステートレスモード:DB を使用せず、cookieCache を使用する場合、セッションは Cookie のみに保存されます
  • customSession プラグイン:カスタムフィールドでセッションを拡張します

セッション管理の詳細については、references/sessions.md を参照してください。

セキュリティチェックリスト

することしないこと
エントロピーの高い32文字以上のシークレットを使用するシークレットをバージョン管理にコミットする
本番環境では baseURL に HTTPS を設定するCSRF チェック(disableCSRFCheck)を無効にする
すべてのフロントエンドに trustedOrigins を設定するオリジンチェックを無効にする
レート制限を有効にする(本番環境ではデフォルトで有効)サーバーレス環境でレート制限ストレージに "memory" を使用する
サーバーレス環境では backgroundTasks.handler を設定するメール認証の設定を省略する
機密性の高いセッションデータには "jwe" Cookie キャッシュを使用するAPI 呼び出しに OAuth トークンを使用する場合に、暗号化せずに保存する
revokeSessionsOnPasswordReset: true を設定する具体的なエラーメッセージ(「ユーザーが見つかりません」など)を返す

セキュリティ強化の完全なガイドについては、references/security.md を参照してください。

よくある注意点

  1. モデル名とテーブル名 — 設定では DB テーブル名ではなく、ORM モデル名を使用します
  2. プラグインのスキーマ — プラグインを追加または変更した後は、CLI を再実行してください
  3. セカンダリストレージ — セッションはデフォルトで DB ではなく、そちらに保存されます。両方に永続化するには session.storeSessionInDatabase: true を設定してください
  4. Cookie キャッシュ — カスタムセッションフィールドはキャッシュされず、常に DB から再取得されます
  5. コールバック URL — 常にオリジンを含む絶対 URL を使用してください(相対パスではなく)
  6. Express v5 — キャッチオールルートには "/api/auth/*" ではなく "/api/auth/*splat" を使用してください
  7. Next.js RSC — サーバーコンポーネントからセッションにアクセスするには、認証設定に nextCookies() プラグインを追加してください

トラブルシューティング

問題解決方法
"Secret not set"BETTER_AUTH_SECRET 環境変数を追加する
"Invalid Origin"trustedOrigins にドメインを追加する
Cookie が設定されないbaseURL がドメインと一致することを確認し、本番環境ではセキュア Cookie を有効にする
OAuth コールバックエラープロバイダーダッシュボードのリダイレクト URI が完全に一致することを確認する
プラグイン追加後に型エラーが発生するCLI の generate/migrate を再実行する
RSC でセッションが null になるnextCookies() プラグインを追加する
2FA のリダイレクトが機能しないクライアントに onTwoFactorRedirect を指定した twoFactorClient を追加する

リファレンス一覧

ファイル参照するタイミング
setup.md新しいプロジェクトのセットアップ、DB の設定、ルートハンドラーの設定
authentication.md認証方式(メール、ソーシャル、パスキー、マジックリンクなど)の実装
sessions.mdセッションの有効期限、キャッシュ、ステートレスモード、セカンダリストレージの設定
security.md本番環境向けのセキュリティ強化 — レート制限、CSRF、Cookie、OAuth のセキュリティ
plugins.mdプラグインの使用や作成、プラグインカタログ
framework-integrations.mdフレームワーク固有のセットアップ(Next.js、Nuxt、SvelteKit、Hono、Express など)
two-factor.md2FA(TOTP、OTP、バックアップコード、信頼済みデバイス)の実装
organizations.mdマルチテナント組織、チーム、招待、RBAC
admin.mdユーザー管理、ロール、利用停止、なりすまし
hooks-and-middleware.mdbefore/after フック、DB フック、ミドルウェアによるカスタムロジック

コメント