claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialsecurity

🔐auth0-nuxt

プラグイン
auth0
ライセンス
Apache-2.0

説明

次のような場合に使用: Nuxt 3 または Nuxt 4 アプリケーションに、Auth0 によるログイン・ログアウト・セッション管理・保護されたルートを追加する場合。 `@auth0/auth0-nuxt` を統合します — ユーザーが「Nuxt アプリにログイン機能を追加したい」と言った場合にも使用してください。

原文を表示

Use when adding Auth0 login, logout, session management, or protected routes to a Nuxt 3 or Nuxt 4 application. Integrates @auth0/auth0-nuxt — use even if the user says "add login to my Nuxt app".

ユースケース

  • Nuxt 3/4にログイン機能を追加するとき
  • Auth0によるセッション管理を実装するとき
  • 保護されたルートを設定するとき
  • ログアウト機能を追加するとき

本文(日本語訳)

Auth0 Nuxt SDK

概要

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

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


次のような場合に使用

使用すべき場合:

  • サーバーサイドレンダリング(Node.js 20 LTS 以上)を伴う Nuxt 3/4 アプリケーションを構築する場合
  • 暗号化クッキーによる安全なセッション管理が必要な場合
  • サーバールートや 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. インストール
npm install @auth0/auth0-nuxt

# 2. シークレットを生成
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  # 任意
// 4. nuxt.config.ts
// 値は空文字列のままにしてください — Nuxt が実行時に NUXT_AUTH0_* 環境変数から自動補完します。
// 明示的なマッピングを好む場合は: domain: process.env.NUXT_AUTH0_DOMAIN || ''
export default defineNuxtConfig({
  modules: ['@auth0/auth0-nuxt'],
  runtimeConfig: {
    auth0: {
      domain: '',
      clientId: '',
      clientSecret: '',
      sessionSecret: '',
      appBaseUrl: 'http://localhost:3000',
      audience: '',  // 任意
    },
  },
})

組み込みルート

SDK が自動でマウントするルートは以下のとおりです:

ルート メソッド 用途
/auth/login GET ログインフローを開始。?returnTo=/path パラメーターをサポート
/auth/callback GET ログイン後の Auth0 コールバックを処理
/auth/logout GET ユーザーをログアウトし、Auth0 のログアウトページへリダイレクト
/auth/backchannel-logout POST バックチャネルログアウト用のログアウトトークンを受信

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


Composable

Composable コンテキスト 用途
useAuth0(event) サーバーサイド getUser()getSession()getAccessToken()logout() にアクセス
useUser() クライアントサイド ユーザーデータの表示のみ。セキュリティチェックには絶対に使用しないこと
// サーバーサイドの例
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 - クライアントナビゲーションの制御
export default defineNuxtRouteMiddleware((to) => {
  if (!useUser().value) return navigateTo(`/auth/login?returnTo=${encodeURIComponent(to.path)}`);
});
// server/middleware/auth.server.ts - SSR の保護
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 エンドポイントの保護
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


セッション管理

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

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

ステートフル(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 のコールバック URL を appBaseUrl + /auth/callback に合わせる
"useAuth0 is not defined" H3 の event オブジェクトを使用してサーバーコンテキストのみで使用する
クッキーが大きすぎる ステートフルセッションを使用するか、スコープを減らす

追加リソース

ガイド: ルート保護パターンカスタムセッションストアよくある使用例


関連 skill

  • auth0-quickstart — Auth0 の基本セットアップ
  • auth0-cli — ターミナルから Auth0 リソースを管理

リンク: Auth0-Nuxt GitHubAuth0 ドキュメントNuxt Modules

原文(English)を表示

Auth0 Nuxt SDK

Overview

Server-side session authentication for Nuxt 3/4. NOT the same as @auth0/auth0-vue (client-side SPA).

Core principle: Uses server-side encrypted cookie sessions, not client-side tokens.

When to Use

Use this when:

  • Building Nuxt 3/4 applications with server-side rendering (Node.js 20 LTS+)
  • Need secure session management with encrypted cookies
  • Protecting server routes and API endpoints
  • Accessing Auth0 Management API or custom APIs

Don't use this when:

  • Using Nuxt 2 (not supported - use different Auth0 SDK)
  • Building pure client-side SPA without server (use @auth0/auth0-vue instead)
  • Using non-Auth0 authentication provider
  • Static site generation only (SSG) without server runtime

Critical Mistakes to Avoid

Mistake Solution
Installing @auth0/auth0-vue or @auth0/auth0-spa-js Use @auth0/auth0-nuxt
Auth0 app type "Single Page Application" Use "Regular Web Application"
Env vars: VITE_AUTH0_* or VUE_APP_AUTH0_* Use NUXT_AUTH0_* prefix
Using useUser() for security checks Use useAuth0(event).getSession() server-side
Missing callback URLs in Auth0 Dashboard Add http://localhost:3000/auth/callback
Weak/missing session secret Generate: openssl rand -hex 64
Hardcoding credentials in nuxt.config.ts Leave runtimeConfig values as empty strings; Nuxt auto-fills from NUXT_AUTH0_* env vars

Quick Setup

# 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
    },
  },
})

Built-in Routes

The SDK automatically mounts these routes:

Route Method Purpose
/auth/login GET Initiates login flow. Supports ?returnTo=/path parameter
/auth/callback GET Handles Auth0 callback after login
/auth/logout GET Logs user out and redirects to Auth0 logout
/auth/backchannel-logout POST Receives logout tokens for back-channel logout

Customize: Pass routes: { login, callback, logout, backchannelLogout } or mountRoutes: false to module config.

Composables

Composable Context Usage
useAuth0(event) Server-side Access getUser(), getSession(), getAccessToken(), logout()
useUser() Client-side Display user data only. Never use for security checks
// 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>

Protecting Routes

Three layers: Route middleware (client), server middleware (SSR), API guards.

// 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' };
});

For role-based, permission-based, and advanced patterns: route-protection.md

Session Management

Stateless (Default)

Uses encrypted, chunked cookies. No configuration needed.

Stateful (Redis, MongoDB, etc.)

For larger sessions or distributed systems:

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

For complete session store implementations, see: session-stores.md

API Integration

Configure audience for API access tokens:

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

Retrieve tokens server-side:

// 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}`
    }
  });
});

Security Checklist

  • ✅ Server-side validation only (never trust useUser())
  • ✅ HTTPS in production
  • ✅ Strong session secret (openssl rand -hex 64)
  • ✅ Never commit .env files
  • ✅ Stateful sessions for PII/large data

Troubleshooting

Error Solution
"Module not found" Install @auth0/auth0-nuxt, not @auth0/auth0-vue
"Missing domain/clientId/clientSecret" Check NUXT_AUTH0_ prefix, .env location, runtimeConfig
"Redirect URI mismatch" Match Auth0 Dashboard callback to appBaseUrl + /auth/callback
"useAuth0 is not defined" Use only in server context with H3 event object
Cookies too large Use stateful sessions or reduce scopes

Additional Resources

Guides: Route Protection PatternsCustom Session StoresCommon Examples

Related Skills

  • auth0-quickstart - Basic Auth0 setup
  • auth0-cli - Manage Auth0 resources from the terminal

Links: Auth0-Nuxt GitHubAuth0 DocsNuxt Modules

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。