实现Nuxt3服务端渲染无法传递token问题

青禾大神
常见问题
发布于 2025-04-28
20 阅读
23 评论
2.4k 点赞
#Nuxt3 #NodeJs

问题根源分析

  • 客户端请求正常:点击按钮时,浏览器能读取 localStorage 的 Token 并添加到请求头。
  • SSR 请求异常:刷新页面时,服务端渲染期间发起的请求无法访问 localStorage(仅浏览器环境存在),导致 Token 缺失。

Cookie 在 SSR 中可被服务端通过请求头读取,同时在浏览器端也能自动携带。需调整前后端逻辑:


使用 Nuxt3 的 useCookie登录成功后存储 Token:

typescript 复制代码
// 登录成功后的代码
const token = useCookie('token') // 使用 useCookie 创建响应式 Cookie
token.value = response.data.token // 将 Token 存入 Cookie

关键点

  • useCookie 会在服务端渲染时自动读取请求头中的 Cookie
  • 自动处理浏览器和服务器环境,无需手动操作 document.cookie

在发起请求时,从 Cookie 读取 Token 并添加到请求头。推荐在 Nuxt3 的 HTTP 客户端 拦截器中实现:

typescript 复制代码
// ~/composables/useApi.ts
export const useApi = () => {
const { $fetch } = useNuxtApp()
const token = useCookie('token')

// 自定义请求方法
const apiFetch = (url: string, options: any = {}) => {
const headers = {
...options.headers,
Authorization: token.value ? `Bearer ${token.value}` : '',
}

return $fetch(url, {
...options,
headers,
})
}

return {
apiFetch,
}
}

使用示例(在组件或页面中):

typescript 复制代码
const { apiFetch } = useApi()

// 发起请求
apiFetch('/api/data', { method: 'GET' })

确保后端中间件能正确读取 Cookie 中的 Token:

javascript 复制代码
// Koa 中间件
app.use(async (ctx, next) => {
const token = ctx.cookies.get('token') || ''

// 验证 Token(示例使用 jsonwebtoken)
if (token) {
try {
const decoded = jwt.verify(token, 'your-secret-key')
ctx.state.user = decoded // 将用户信息挂载到上下文
} catch (err) {
ctx.cookies.set('token', null) // 清除无效 Token
}
}

await next()
})

关键点

  • 使用 koa-cookiekoa-bodyparser 中间件确保正确解析 Cookie。
  • 验证 Token 后处理用户状态(如挂载到 ctx.state)。

4. 安全配置(可选但强烈建议)

  • Cookie 属性加固
typescript 复制代码
const token = useCookie('token', {
httpOnly: true, // 防止 XSS 读取
secure: true, // 仅 HTTPS 传输
sameSite: 'strict',// 防止 CSRF
maxAge: 86400 // 有效期(秒)
})
  • CORS 配置(若跨域):
javascript 复制代码
// Koa 中间件
ctx.set('Access-Control-Allow-Origin', 'https://your-domain.com')
ctx.set('Access-Control-Allow-Credentials', 'true')

验证流程

  1. 用户登录 → Token 存入 Cookie。
  2. 页面刷新 → SSR 服务端读取 Cookie 中的 Token → 发起 API 请求时携带 Token。
  3. 后端验证 Token → 返回数据。

可能遇到的问题

  • Cookie 未生效:检查域名、路径和安全性设置,确保前后端同域或跨域配置正确。
  • HttpOnly 与前端读取冲突:如果前端需要读取 Token,需移除 httpOnly,但需加强 XSS 防御。
  • 客户端跳转后 Cookie 丢失:确保登录后 Cookie 成功写入,可通过浏览器开发者工具查看。

通过以上步骤,SSR 请求将能正确携带 Token,解决刷新页面时的认证问题。

青禾大神

Vue技术专家 | 5年开发经验

专注前端技术领域,Vue生态贡献者,定期分享前沿技术文章。

评论 (128)

前端小白

这篇文章讲得太好了,解决了我很多疑惑!

资深开发者

对依赖收集部分的讲解很深入,期待更多原理分析文章!

相关推荐

Vue3组合式API最佳实践

3.2k阅读 · 86评论

Pinia状态管理深度解析

2.5k阅读 · 45评论