auth0-nuxt

작성자: auth0

Auth0 인증을 Nuxt 3/4 애플리케이션에 구현할 때, 세션 관리 구성, 미들웨어로 라우트 보호, 또는 API 통합 시 사용합니다.

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

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

MistakeSolution
Installing @auth0/auth0-vue or @auth0/auth0-spa-jsUse @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 checksUse useAuth0(event).getSession() server-side
Missing callback URLs in Auth0 DashboardAdd http://localhost:3000/auth/callback
Weak/missing session secretGenerate: openssl rand -hex 64
Hardcoding credentials in nuxt.config.tsLeave 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:

RouteMethodPurpose
/auth/loginGETInitiates login flow. Supports ?returnTo=/path parameter
/auth/callbackGETHandles Auth0 callback after login
/auth/logoutGETLogs user out and redirects to Auth0 logout
/auth/backchannel-logoutPOSTReceives logout tokens for back-channel logout

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

Composables

ComposableContextUsage
useAuth0(event)Server-sideAccess getUser(), getSession(), getAccessToken(), logout()
useUser()Client-sideDisplay 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

ErrorSolution
"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 largeUse 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

auth0의 다른 스킬

acul-screen-generator
auth0
완전한 브랜드 적용 Auth0 Advanced Custom Universal Login (ACUL) 화면 구현을 React 또는 Vanilla JS SDK를 사용하여 생성합니다. 개발자가 요청할 때 사용하세요.
official
auth0-android
auth0
Android 애플리케이션(Kotlin/Java)에 Web Auth, 생체 인증 보호 자격 증명 및 MFA를 사용하여 인증을 추가할 때 사용합니다 - 통합…
official
auth0-angular
auth0
Angular 애플리케이션에 라우트 가드 및 HTTP 인터셉터를 사용하여 인증을 추가할 때 사용하며, SPA를 위해 @auth0/auth0-angular SDK를 통합합니다.
official
auth0-aspnetcore-api
auth0
ASP.NET Core Web API 엔드포인트를 JWT Bearer 토큰 검증, 범위/권한 확인 또는 무상태 인증으로 보호할 때 사용합니다 - 통합…
official
auth0-cli
auth0
Auth0 CLI 명령어 참조 — 앱, API, 사용자, 역할, 조직, 액션, 로그, 사용자 정의 도메인, 유니버설 로그인, 테라폼, 원시 API 모드, --json…
official
auth0-expo
auth0
Expo(React Native) 모바일 앱에 인증(로그인, 로그아웃, 사용자 세션, 보호된 라우트, 생체 인증, 토큰 관리)을 추가할 때 사용합니다. 통합…
official
auth0-express
auth0
Express.js 웹 애플리케이션에 인증(로그인, 로그아웃, 보호된 라우트)을 추가할 때 사용 - 세션 기반 인증을 위해 express-openid-connect를 통합합니다.
official
auth0-fastapi-api
auth0
FastAPI API 엔드포인트를 JWT Bearer 토큰 검증, 범위/권한 확인 또는 무상태 인증으로 보호할 때 사용 - REST를 위해 auth0-fastapi-api 통합…
official