mcpField
A
auth0-nuxt

auth0-nuxt

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

auth0-nuxt について

Auth0 によるサーバーサイド認証を使う Nuxt 3/4 アプリ開発者向けのスキルです。暗号化 Cookie セッション、サーバールートと API の保護、API アクセストークンの取得を扱います。

主な機能

  1. 01暗号化 Cookie セッション
  2. 02ログインとコールバックの組み込みルート
  3. 03サーバー側のユーザーとセッション操作
  4. 04ルートと API の保護パターン
  5. 05サーバー側でのアクセストークン取得
  6. 06ステートレスまたはステートフルなセッション

活用シーン

  1. 01Nuxt 3/4 アプリに Auth0 ログインを追加
  2. 02サーバールートと API を保護
  3. 03サーバーからトークンが必要な API を呼び出す

インストール

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

$npx skills add https://github.com/auth0/agent-skills --skill auth0-nuxt

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

同梱ファイル

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

references/
examples.md
route-protection.md
session-stores.md

詳細

Auth0 Nuxt SDK

概要

Nuxt 3/4 向けのサーバーサイドセッション認証です。@auth0/auth0-vue(クライアントサイド SPA)とは異なります。

基本原則: クライアントサイドトークンではなく、サーバーサイドの暗号化Cookieセッションを使用します。

使用する場合

次の場合に使用します:

  • サーバーサイドレンダリングを使用する Nuxt 3/4 アプリケーションを構築する場合(Node.js 20 LTS+)
  • 暗号化Cookieを使用した安全なセッション管理が必要な場合
  • サーバールートと API エンドポイントを保護する場合
  • Auth0 Management API またはカスタム API にアクセスする場合

次の場合は使用しないでください:

  • Nuxt 2 を使用する場合(サポート対象外です。別の Auth0 SDK を使用してください)
  • サーバーのない、クライアントサイドのみの SPA を構築する場合(代わりに @auth0/auth0-vue を使用してください)
  • Auth0 以外の認証プロバイダーを使用する場合
  • サーバーランタイムのない静的サイト生成(SSG)のみを行う場合

避けるべき重大な誤り

誤り解決策
@auth0/auth0-vue または @auth0/auth0-spa-js をインストールする@auth0/auth0-nuxt を使用します
Auth0 アプリの種類を「Single Page Application」にする「Regular Web Application」を使用します
環境変数に VITE_AUTH0_* または VUE_APP_AUTH0_* を使用するNUXT_AUTH0_* プレフィックスを使用します
セキュリティチェックに useUser() を使用するサーバーサイドで useAuth0(event).getSession() を使用します
Auth0 Dashboard にコールバック URL がないhttp://localhost:3000/auth/callback を追加します
セッションシークレットが弱い、または設定されていない生成します:openssl rand -hex 64
認証情報を nuxt.config.ts にハードコードするruntimeConfig の値は空文字列のままにします。Nuxt が NUXT_AUTH0_* 環境変数から自動的に設定します

クイックセットアップ

# 1. Install
npm install @auth0/auth0-nuxt

# 2. Generate secret
openssl rand -hex 64
# 3. .env
NUXT_AUTH0_DOMAIN=your-tenant.auth0.com
NUXT_AUTH0_CLIENT_ID=your-client-id
NUXT_AUTH0_CLIENT_SECRET=your-client-secret
NUXT_AUTH0_SESSION_SECRET=<from-openssl>
NUXT_AUTH0_APP_BASE_URL=http://localhost:3000
NUXT_AUTH0_AUDIENCE=https://your-api  # optional
// 4. nuxt.config.ts
// Leave values as empty strings — Nuxt auto-fills them from NUXT_AUTH0_* env vars at runtime.
// If you prefer explicit mapping, use: domain: process.env.NUXT_AUTH0_DOMAIN || ''
export default defineNuxtConfig({
  modules: ['@auth0/auth0-nuxt'],
  runtimeConfig: {
    auth0: {
      domain: '',
      clientId: '',
      clientSecret: '',
      sessionSecret: '',
      appBaseUrl: 'http://localhost:3000',
      audience: '',  // optional
    },
  },
})

組み込みルート

SDK は次のルートを自動的にマウントします:

ルートメソッド用途
/auth/loginGETログインフローを開始します。?returnTo=/path パラメーターをサポートします
/auth/callbackGETログイン後の Auth0 コールバックを処理します
/auth/logoutGETユーザーをログアウトさせ、Auth0 のログアウトページにリダイレクトします
/auth/backchannel-logoutPOSTバックチャネルログアウト用のログアウトトークンを受け取ります

カスタマイズ: モジュール設定に routes: { login, callback, logout, backchannelLogout } または mountRoutes: false を渡します。

コンポーザブル

コンポーザブルコンテキスト用途
useAuth0(event)サーバーサイドgetUser()、getSession()、getAccessToken()、logout() にアクセスします
useUser()クライアントサイドユーザーデータの表示専用です。セキュリティチェックには絶対に使用しないでください
// Server example
const auth0 = useAuth0(event);
const session = await auth0.getSession();
<script setup>
const user = useUser();
</script>

<template>
  <div v-if="user">Welcome {{ user.name }}</div>
<template>

ルートの保護

3 つのレイヤー: ルートミドルウェア(クライアント)、サーバーミドルウェア(SSR)、API ガード。

// middleware/auth.ts - Client navigation
export default defineNuxtRouteMiddleware((to) => {
  if (!useUser().value) return navigateTo(`/auth/login?returnTo=${encodeURIComponent(to.path)}`);
});
// server/middleware/auth.server.ts - SSR protection
export default defineEventHandler(async (event) => {
  const url = getRequestURL(event);
  const auth0Client = useAuth0(event);
  const session = await auth0Client.getSession();
  if (!session)  {
    return sendRedirect(event, `/auth/login?returnTo=${encodeURIComponent(url.pathname)}`);
  }
});
// server/api/protected.ts - API endpoint protection
export default defineEventHandler(async (event) => {
  const auth0Client = useAuth0(event);
  const session = await auth0Client.getSession();

  if (!session) {
    throw createError({
      statusCode: 401,
      statusMessage: 'Unauthorized'
    });
  }

  return { data: 'protected data' };
});

ロールベース、権限ベース、および高度なパターンについては: route-protection.md

セッション管理

ステートレス(デフォルト)

暗号化されたチャンク分割Cookieを使用します。設定は不要です。

ステートフル(Redis、MongoDB など)

大規模なセッションや分散システム向け:

// nuxt.config.ts
modules: [
  ['@auth0/auth0-nuxt', {
    sessionStoreFactoryPath: '~/server/utils/session-store-factory.ts'
  }]
]

セッションストアの完全な実装については、次を参照してください: session-stores.md

API 連携

API アクセストークン用の audience を設定します:

// nuxt.config.ts
runtimeConfig: {
  auth0: {
    audience: 'https://your-api-identifier',
  }
}

サーバーサイドでトークンを取得します:

// server/api/call-api.ts
export default defineEventHandler(async (event) => {
  const auth0Client = useAuth0(event);
  const { accessToken } = await auth0Client.getAccessToken();

  return await $fetch('https://api.example.com/data', {
    headers: {
      Authorization: `Bearer ${accessToken}`
    }
  });
});

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

  • ✅ サーバーサイドでのみ検証する(useUser() を決して信頼しない)
  • ✅ 本番環境では HTTPS を使用する
  • ✅ 強力なセッションシークレットを使用する(openssl rand -hex 64)
  • ✅ .env ファイルを絶対にコミットしない
  • ✅ PII/大容量データにはステートフルセッションを使用する

トラブルシューティング

エラー解決策
"Module not found"@auth0/auth0-vue ではなく @auth0/auth0-nuxt をインストールします
"Missing domain/clientId/clientSecret"NUXT_AUTH0_ プレフィックス、.env の場所、runtimeConfig を確認します
"Redirect URI mismatch"Auth0 Dashboard のコールバックを appBaseUrl + /auth/callback と一致させます
"useAuth0 is not defined"H3 イベントオブジェクトとともに、サーバーコンテキスト内でのみ使用します
Cookie が大きすぎるステートフルセッションを使用するか、スコープを減らします

追加リソース

ガイド: ルート保護のパターン • カスタムセッションストア • 一般的な例

関連スキル

  • auth0-quickstart - Auth0 の基本設定
  • auth0-cli - ターミナルから Auth0 リソースを管理

リンク: Auth0-Nuxt GitHub • Auth0 Docs • Nuxt Modules

コメント