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.
Use this when:
Don't use this when:
MistakeSolutionInstalling @auth0/auth0-vue or @auth0/auth0-spa-jsUse @auth0/auth0-nuxtAuth0 app type "Single Page Application"Use "Regular Web Application"Env vars: VITE_AUTH0_* or VUE_APP_AUTH0_*Use NUXT_AUTH0_* prefixUsing useUser() for security checksUse useAuth0(event).getSession() server-sideMissing callback URLs in Auth0 DashboardAdd http://localhost:3000/auth/callbackWeak/missing session secretGenerate: openssl rand -hex 64
bash
# 1. Install
npm install @auth0/auth0-nuxt
# 2. Generate secret
openssl rand -hex 64
bash
# 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
typescript
// 4. nuxt.config.ts
export default defineNuxtConfig({
modules: ['@auth0/auth0-nuxt'],
runtimeConfig: {
auth0: {
domain: '',
clientId: '',
clientSecret: '',
sessionSecret: '',
appBaseUrl: 'http://localhost:3000',
audience: '', // optional
},
},
})
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.
ComposableContextUsageuseAuth0(event)Server-sideAccess getUser(), getSession(), getAccessToken(), logout()``useUser()Client-sideDisplay user data only. Never use for security checkstypescript
// Server example
const auth0 = useAuth0(event);
const session = await auth0.getSession();
vue
<script setup>
const user = useUser();
</script>
<template>
<div v-if="user">Welcome {{ user.name }}</div>
<template>
Three layers: Route middleware (client), server middleware (SSR), API guards.
typescript
// middleware/auth.ts - Client navigation
export default defineNuxtRouteMiddleware((to) => {
if (!useUser().value) return navigateTo(`/auth/login?returnTo=${encodeURIComponent(to.path)}`);
});
typescript
// 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)}`);
}
});
typescript
// 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
Uses encrypted, chunked cookies. No configuration needed.
For larger sessions or distributed systems:
typescript
// nuxt.config.ts
modules: [
['@auth0/auth0-nuxt', {
sessionStoreFactoryPath: '~/server/utils/session-store-factory.ts'
}]
]
For complete session store implementations, see: session-stores.md
Configure audience for API access tokens:
typescript
// nuxt.config.ts
runtimeConfig: {
auth0: {
audience: 'https://your-api-identifier',
}
}
Retrieve tokens server-side:
typescript
// 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())openssl rand -hex 64).env filesErrorSolution"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 objectCookies too largeUse stateful sessions or reduce scopes
Guides: Route Protection Patterns • Custom Session Stores • Common Examples
auth0-quickstart - Basic Auth0 setupauth0-cli - Manage Auth0 resources from the terminalLinks: Auth0-Nuxt GitHub • Auth0 Docs • Nuxt Modules