mcpField
A
auth0-nuxt

auth0-nuxt

github.com/auth0安全55594 次安装1 天前更新
代码仓库

关于 auth0-nuxt

面向使用 Auth0 服务端身份验证构建 Nuxt 3/4 应用的开发者。重点介绍加密 Cookie 会话、服务端路由与 API 保护,以及 API 访问令牌的获取。

主要功能

  1. 01加密 Cookie 会话
  2. 02内置登录与回调路由
  3. 03服务端用户和会话访问
  4. 04路由及 API 保护模式
  5. 05服务端访问令牌获取
  6. 06无状态或有状态会话

适用场景

  1. 01为 Nuxt 3/4 应用添加 Auth0 登录
  2. 02保护服务端路由和 API
  3. 03从服务端调用需要令牌的 API

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/auth0-nuxt确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
examples.md
route-protection.md
session-stores.md

详细介绍

Auth0 Nuxt SDK

概述

适用于 Nuxt 3/4 的服务端会话身份验证。与 @auth0/auth0-vue(客户端 SPA)不同。

核心原则: 使用服务端加密 Cookie 会话,而非客户端令牌。

适用场景

在以下情况下使用:

  • 构建使用服务端渲染的 Nuxt 3/4 应用(Node.js 20 LTS+)
  • 需要通过加密 Cookie 安全地管理会话
  • 保护服务端路由和 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. 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
    },
  },
})

内置路由

SDK 会自动挂载以下路由:

路由方法用途
/auth/loginGET启动登录流程。支持 ?returnTo=/path 参数
/auth/callbackGET处理登录后的 Auth0 回调
/auth/logoutGET将用户登出并重定向至 Auth0 登出页面
/auth/backchannel-logoutPOST接收用于后端通道登出的登出令牌

自定义: 向模块配置传入 routes: { login, callback, logout, backchannelLogout } 或 mountRoutes: false。

组合式函数

组合式函数上下文用法
useAuth0(event)服务端访问 getUser()、getSession()、getAccessToken()、logout()
useUser()客户端仅用于显示用户数据。绝不可用于安全检查
// 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>

保护路由

三个层级: 路由中间件(客户端)、服务端中间件(SSR)、API 守卫。

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

有关基于角色、基于权限和高级用法: route-protection.md

会话管理

无状态(默认)

使用加密、分块 Cookie。无需配置。

有状态(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-nuxt,而非 @auth0/auth0-vue
"Missing domain/clientId/clientSecret"检查 NUXT_AUTH0_ 前缀、.env 位置和 runtimeConfig
"Redirect URI mismatch"确保 Auth0 Dashboard 中的回调地址与 appBaseUrl + /auth/callback 一致
"useAuth0 is not defined"仅在服务端上下文中使用,并传入 H3 event 对象
Cookie 过大使用有状态会话或减少作用域

更多资源

指南: 路由保护模式 • 自定义会话存储 • 常见示例

相关技能

  • auth0-quickstart - Auth0 基础设置
  • auth0-cli - 在终端中管理 Auth0 资源

链接: Auth0-Nuxt GitHub • Auth0 文档 • Nuxt 模块

评论

支持 Markdown