Skip to content

NuxSaaSにおけるBetter Authを使った認証

NuxSaaSは、Nuxt.jsアプリケーション向けの包括的な認証ソリューションであるBetter Authを採用しています。本ドキュメントでは、NuxSaaSがBetter Authをどのように統合し、安全で柔軟なユーザー認証を実現しているか、またその理由について説明します。

NuxSaaSによるBetter Authの実装方法

Better Authは主にserver/utils/auth.ts内で設定されています。この中心的なファイルで認証戦略、データベースアダプター、メール処理、フックなどを定義しています。

主な実装ポイント

  1. コア設定(server/utils/auth.ts:

    • データベースアダプター: drizzleAdapterを使用して、Better AuthをDrizzle ORMおよびPostgreSQLデータベースに接続します。認証関連テーブル(useraccountsessionverificationなど)のスキーマはserver/database/schema/auth.tsにあります。
    • メール&パスワード: メール認証が有効で、メール認証が必須です。パスワードリセットや認証メールの送信方法を定義し、メールサービス(例:Resend、runtimeConfigで設定)と連携します。
    • ソーシャルプロバイダー: GitHubやGoogleなどのOAuthプロバイダーに対応。クライアントIDやシークレットはruntimeConfigで管理します。
    • フック: 監査ログ用のafterフックを実装。認証成功・失敗、パスワードリセット、メール認証などのイベントをlogAuditEventで記録します。
    • プラグイン: admin()(管理機能用)やsetupStripe()(Stripe課金連携用)など、Better Authのプラグインを統合しています。
    typescript
    // server/utils/auth.tsの抜粋
    const createBetterAuth = () => betterAuth({
      baseURL: runtimeConfig.public.baseURL,
      secret: runtimeConfig.betterAuthSecret,
      database: drizzleAdapter(
        getDB(),
        {
          provider: 'pg',
          schema
        }
      ),
      // ...他の設定(emailAndPassword, socialProviders, hooksなど)
    });
  2. セッション取得(app/plugins/auth.server.tsおよびapp/plugins/auth.client.ts:

    • サーバー側(auth.server.ts)では、ページがサーバーレンダリングされキャッシュされていない場合、初回リクエスト時にセッションを取得し、ユーザー状態を即座に利用可能にします。
    • クライアント側(auth.client.ts)では、ページがサーバーレンダリングされていない場合やプリレンダ・キャッシュされた場合にセッション取得を行い、ハイドレーションの不整合を防ぎ、クライアントの認証状態を同期します。
  3. ルート保護(server/middleware/1.auth.tsおよびapp/middleware/auth.global.ts:

    • サーバー側ミドルウェア(1.auth.ts)は、/api/admin/**のようなAPIルートを保護し、'admin'ロールを持つ認証済みユーザーのみアクセス可能にします。server/utils/auth.tsrequireAuthを利用します。
    • クライアント側グローバルミドルウェア(auth.global.ts)は、ページ単位のルート保護を担当。認証状態を確認し、ルートメタデータ(例:auth: trueは保護ページ、guest: trueは未認証ユーザー専用ページ)に基づきリダイレクトします。
  4. コンポーザブル(app/composables/useAuth.ts:

    • カスタムコンポーザブルuseAuth()は、おそらくBetter Authのクライアントユーティリティをラップし、Vueコンポーネント全体でセッション状態やサインイン/サインアウト関数などを簡単に利用できるようにしています。
  5. データベーススキーマ(server/database/schema/auth.ts:

    • このファイルで、Better Authに必要なテーブル(useraccountverificationなど)のDrizzle ORMスキーマを定義しています。これらのテーブルはユーザー認証情報、連携ソーシャルアカウント、メール認証トークンなどを保存します。

なぜBetter Authなのか?

  • 拡張性: OAuth、メール/パスワード、カスタムプロバイダーなど多様な認証戦略に対応し、独自プロバイダーも追加可能。
  • デフォルトで安全: CSRF対策や安全なセッション管理など、セキュリティのベストプラクティスを実装。
  • データベース非依存(アダプター経由): NuxSaaSではDrizzle+PostgreSQLを使用していますが、Better Authは複数のデータベースアダプターをサポートし柔軟性があります。
  • サーバー・クライアント両対応: バックエンド認証ロジックとフロントエンドのセッション管理の両方に対応した包括的なツールを提供。
  • 活発なコミュニティと開発: Nuxt認証の人気選択肢であり、継続的な開発とコミュニティサポートが受けられます。

Better Authを採用することで、NuxSaaSは堅牢で安全、かつ開発者フレンドリーな認証システムを簡単に保守・拡張できる形で提供しています。