NuxSaaSにおけるBetter Authを使った認証
NuxSaaSは、Nuxt.jsアプリケーション向けの包括的な認証ソリューションであるBetter Authを採用しています。本ドキュメントでは、NuxSaaSがBetter Authをどのように統合し、安全で柔軟なユーザー認証を実現しているか、またその理由について説明します。
NuxSaaSによるBetter Authの実装方法
Better Authは主にserver/utils/auth.ts内で設定されています。この中心的なファイルで認証戦略、データベースアダプター、メール処理、フックなどを定義しています。
主な実装ポイント
コア設定(
server/utils/auth.ts):- データベースアダプター:
drizzleAdapterを使用して、Better AuthをDrizzle ORMおよびPostgreSQLデータベースに接続します。認証関連テーブル(user、account、session、verificationなど)のスキーマは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など) });- データベースアダプター:
セッション取得(
app/plugins/auth.server.tsおよびapp/plugins/auth.client.ts):- サーバー側(
auth.server.ts)では、ページがサーバーレンダリングされキャッシュされていない場合、初回リクエスト時にセッションを取得し、ユーザー状態を即座に利用可能にします。 - クライアント側(
auth.client.ts)では、ページがサーバーレンダリングされていない場合やプリレンダ・キャッシュされた場合にセッション取得を行い、ハイドレーションの不整合を防ぎ、クライアントの認証状態を同期します。
- サーバー側(
ルート保護(
server/middleware/1.auth.tsおよびapp/middleware/auth.global.ts):- サーバー側ミドルウェア(
1.auth.ts)は、/api/admin/**のようなAPIルートを保護し、'admin'ロールを持つ認証済みユーザーのみアクセス可能にします。server/utils/auth.tsのrequireAuthを利用します。 - クライアント側グローバルミドルウェア(
auth.global.ts)は、ページ単位のルート保護を担当。認証状態を確認し、ルートメタデータ(例:auth: trueは保護ページ、guest: trueは未認証ユーザー専用ページ)に基づきリダイレクトします。
- サーバー側ミドルウェア(
コンポーザブル(
app/composables/useAuth.ts):- カスタムコンポーザブル
useAuth()は、おそらくBetter Authのクライアントユーティリティをラップし、Vueコンポーネント全体でセッション状態やサインイン/サインアウト関数などを簡単に利用できるようにしています。
- カスタムコンポーザブル
データベーススキーマ(
server/database/schema/auth.ts):- このファイルで、Better Authに必要なテーブル(
user、account、verificationなど)のDrizzle ORMスキーマを定義しています。これらのテーブルはユーザー認証情報、連携ソーシャルアカウント、メール認証トークンなどを保存します。
- このファイルで、Better Authに必要なテーブル(
なぜBetter Authなのか?
- 拡張性: OAuth、メール/パスワード、カスタムプロバイダーなど多様な認証戦略に対応し、独自プロバイダーも追加可能。
- デフォルトで安全: CSRF対策や安全なセッション管理など、セキュリティのベストプラクティスを実装。
- データベース非依存(アダプター経由): NuxSaaSではDrizzle+PostgreSQLを使用していますが、Better Authは複数のデータベースアダプターをサポートし柔軟性があります。
- サーバー・クライアント両対応: バックエンド認証ロジックとフロントエンドのセッション管理の両方に対応した包括的なツールを提供。
- 活発なコミュニティと開発: Nuxt認証の人気選択肢であり、継続的な開発とコミュニティサポートが受けられます。
Better Authを採用することで、NuxSaaSは堅牢で安全、かつ開発者フレンドリーな認証システムを簡単に保守・拡張できる形で提供しています。