🔐auth0-nuxt
- プラグイン
- auth0
- ライセンス
- Apache-2.0
- ソース
- GitHub で見る ↗
説明
次のような場合に使用: 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 GitHub • Auth0 ドキュメント • 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
.envfiles - ✅ 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 Patterns • Custom Session Stores • Common Examples
Related Skills
auth0-quickstart- Basic Auth0 setupauth0-cli- Manage Auth0 resources from the terminal
Links: Auth0-Nuxt GitHub • Auth0 Docs • Nuxt Modules
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。