auth0-nuxt

À utiliser lors de l'implémentation de l'authentification Auth0 dans des applications Nuxt 3/4, de la configuration de la gestion des sessions, de la protection des routes avec des middleware, ou de l'intégration de tokens d'accès API — fournit des patterns de configuration, l'utilisation des composables et les bonnes pratiques de sécurité pour le SDK `@auth0/auth0-nuxt`

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

SDK Nuxt Auth0

Vue d'ensemble

Authentification par session côté serveur pour Nuxt 3/4. N'est PAS la même chose que @auth0/auth0-vue (SPA côté client).

Principe fondamental : Utilise les sessions de cookie chiffré côté serveur, pas les tokens côté client.

Quand l'utiliser

Utilisez ceci quand :

  • Construire des applications Nuxt 3/4 avec rendu côté serveur (Node.js 20 LTS+)
  • Besoin de gestion sécurisée des sessions avec cookies chiffrés
  • Protection des routes serveur et des endpoints API
  • Accès à l'API Auth0 Management ou à des API personnalisées

Ne l'utilisez pas quand :

  • Utilisation de Nuxt 2 (non supporté - utilisez un SDK Auth0 différent)
  • Construction d'une SPA purement côté client sans serveur (utilisez @auth0/auth0-vue à la place)
  • Utilisation d'un fournisseur d'authentification autre qu'Auth0
  • Génération de site statique uniquement (SSG) sans runtime serveur

Erreurs critiques à éviter

Erreur Solution
Installation de @auth0/auth0-vue ou @auth0/auth0-spa-js Utilisez @auth0/auth0-nuxt
Type d'app Auth0 "Single Page Application" Utilisez "Regular Web Application"
Variables env : VITE_AUTH0_* ou VUE_APP_AUTH0_* Utilisez le préfixe NUXT_AUTH0_*
Utilisation de useUser() pour des vérifications de sécurité Utilisez useAuth0(event).getSession() côté serveur
URLs de callback manquantes dans Auth0 Dashboard Ajoutez http://localhost:3000/auth/callback
Secret de session faible ou manquant Générez : openssl rand -hex 64

Configuration rapide

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

# 2. Générer 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
export default defineNuxtConfig({
  modules: ['@auth0/auth0-nuxt'],
  runtimeConfig: {
    auth0: {
      domain: '',
      clientId: '',
      clientSecret: '',
      sessionSecret: '',
      appBaseUrl: 'http://localhost:3000',
      audience: '',  // optional
    },
  },
})

Routes intégrées

Le SDK monte automatiquement ces routes :

Route Méthode Objectif
/auth/login GET Initie le flux de connexion. Supporte le paramètre ?returnTo=/path
/auth/callback GET Gère le callback Auth0 après la connexion
/auth/logout GET Déconnecte l'utilisateur et redirige vers la déconnexion Auth0
/auth/backchannel-logout POST Reçoit les tokens de déconnexion pour la déconnexion back-channel

Personnaliser : Passez routes: { login, callback, logout, backchannelLogout } ou mountRoutes: false à la config du module.

Composables

Composable Contexte Utilisation
useAuth0(event) Côté serveur Accédez à getUser(), getSession(), getAccessToken(), logout()
useUser() Côté client Affichage des données utilisateur uniquement. N'utilisez jamais pour les vérifications de sécurité
// Exemple serveur
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>

Protection des routes

Trois niveaux : Route middleware (client), server middleware (SSR), API guards.

// middleware/auth.ts - Navigation client
export default defineNuxtRouteMiddleware((to) => {
  if (!useUser().value) return navigateTo(`/auth/login?returnTo=${encodeURIComponent(to.path)}`);
});
// server/middleware/auth.server.ts - Protection 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 - Protection endpoint 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' };
});

Pour les patterns basés sur les rôles, les permissions, et les patterns avancés : route-protection.md

Gestion des sessions

Stateless (Défaut)

Utilise des cookies chiffrés et fragmentés. Aucune configuration nécessaire.

Stateful (Redis, MongoDB, etc.)

Pour les sessions plus volumineuses ou les systèmes distribués :

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

Pour les implémentations complètes de session store, voir : session-stores.md

Intégration API

Configurez l'audience pour les tokens d'accès API :

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

Récupérez les tokens côté serveur :

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

Checklist de sécurité

  • ✅ Validation côté serveur uniquement (ne faites jamais confiance à useUser())
  • ✅ HTTPS en production
  • ✅ Secret de session fort (openssl rand -hex 64)
  • ✅ Ne validez jamais les fichiers .env
  • ✅ Sessions stateful pour les PII/données volumineuses

Dépannage

Erreur Solution
"Module not found" Installez @auth0/auth0-nuxt, pas @auth0/auth0-vue
"Missing domain/clientId/clientSecret" Vérifiez le préfixe NUXT_AUTH0_, l'emplacement .env, runtimeConfig
"Redirect URI mismatch" Faites correspondre le callback Auth0 Dashboard à appBaseUrl + /auth/callback
"useAuth0 is not defined" Utilisez uniquement dans le contexte serveur avec l'objet H3 event
Cookies trop volumineux Utilisez les sessions stateful ou réduisez les scopes

Ressources supplémentaires

Guides : Route Protection PatternsCustom Session StoresCommon Examples

Liens : Auth0-Nuxt GitHubAuth0 DocsNuxt Modules

Skills similaires