0

0

Nuxt3 Apollo 高级认证:同时管理多重请求头(JWT与会话)

碧海醫心

碧海醫心

发布时间:2025-10-24 13:14:22

|

910人浏览过

|

来源于php中文网

原创

Nuxt3 Apollo 高级认证:同时管理多重请求头(JWT与会话)

本教程详细阐述了在 nuxt3 应用中,如何通过 nuxt apollo 客户端同时管理多重认证请求头(如 jwt 和 woocommerce 会话)。当 nuxt apollo 的默认配置无法满足复杂认证需求时,我们将学习如何自定义 apollo client 实例,并通过手动注入的方式,完全控制请求头、会话管理和认证逻辑,从而实现灵活且强大的认证机制。

Nuxt3 Apollo 中多重认证请求头的挑战

在开发基于 Nuxt3、WPGraphQL 和 WooCommerce 的无头应用程序时,一个常见的挑战是需要同时处理多种认证机制。例如,你可能需要一个 woocommerce-session 请求头来管理访客购物车会话,同时又需要一个 Authorization: Bearer 请求头来处理已登录用户的身份验证。

Nuxt Apollo 模块提供了一套便捷的认证配置选项,如 authType 和 authHeader。然而,这些选项通常旨在支持单一的认证令牌类型和请求头。当试图同时管理多个动态变化的请求头时,Nuxt Apollo 的默认 apollo:auth 钩子和 nuxt.config.ts 中的客户端配置可能会导致冲突,使得你无法灵活地设置和更新所有必要的请求头。这种限制使得在需要同时维护用户登录状态和访客购物车会话的场景下,默认配置显得力不从心。

自定义 Apollo Client 实例以实现灵活认证

解决上述问题的核心在于完全掌控 Apollo Client 的实例化过程,绕过 Nuxt Apollo 模块的默认认证处理,转而使用自定义的 Apollo Link 链来构建客户端。

1. Nuxt Apollo 插件 (apollo.js) 配置

我们将创建一个 Nuxt 插件 (plugins/apollo.js) 来初始化和配置我们的 Apollo Client。这个插件将负责:

  • 定义 GraphQL HTTP 端点。
  • 通过 setContext 动态注入多个认证请求头。
  • 通过 ApolloLink 的 afterware 机制处理响应头,例如更新会话 ID。
  • 最终,手动将自定义的 Apollo Client 实例注入到 Nuxt 应用上下文中。
import {
  createHttpLink,
  ApolloLink,
  from,
  InMemoryCache,
  ApolloClient
} from '@apollo/client/core';
import { setContext } from '@apollo/client/link/context';
import { provideApolloClient } from '@vue/apollo-composable'; // 用于 Vue 组合式 API

export default defineNuxtPlugin((nuxtApp) => {
  // 从 Cookie 中获取 JWT 令牌和 WooCommerce 会话 ID
  const wooJWT = useCookie('woo-jwt');
  const wooSession = useCookie('woo-session', {
    maxAge: 86_400, // 会话 Cookie 有效期,例如 1 天
    sameSite: 'lax' // 跨站请求策略
  });

  const config = useRuntimeConfig();

  // 1. HTTP Link: 定义 GraphQL 后端地址
  const httpLink = createHttpLink({
    uri: config.public.graphqlURL,
  });

  // 2. Auth Link: 动态设置认证请求头
  // 使用 setContext 确保在每次请求前检查并设置最新的 JWT 和会话 ID
  const authLink = setContext(async (_, { headers }) => {
    return {
      headers: {
        ...headers,
        // 如果存在 JWT,则添加 Authorization 请求头
        authorization: wooJWT.value ? `Bearer ${wooJWT.value}` : '',
        // 如果存在 WooCommerce 会话 ID,则添加 woocommerce-session 请求头
        'woocommerce-session': wooSession.value
          ? `Session ${wooSession.value}`
          : ''
      }
    };
  });

  // 3. Afterware Link: 处理来自响应的请求头
  // 监听响应头,例如更新 WooCommerce 会话 ID
  const afterware = new ApolloLink((operation, forward) =>
    forward(operation).map((response) => {
      const context = operation.getContext();
      const {
        response: { headers }
      } = context;
      const session = headers.get('woocommerce-session');

      if (process.client && session) {
        // 如果响应头中包含新的会话 ID,则更新本地 Cookie
        if (session !== wooSession.value) {
          wooSession.value = session;
        }
      }
      return response;
    })
  );

  // 4. 缓存实现
  const cache = new InMemoryCache();

  // 5. 创建 Apollo Client 实例
  // 将 authLink, afterware, httpLink 按顺序链式组合
  const apolloClient = new ApolloClient({
    link: from([authLink, afterware, httpLink]),
    cache
  });

  // 如果需要直接在 Vue 组合式 API 中使用,可以保留此行
  // 否则,通过 nuxtApp._apolloClients.default 赋值已经足够
  provideApolloClient(apolloClient);

  /**
   * 关键步骤:
   * 移除 Nuxt Apollo 的 'apollo:auth' 钩子,
   * 并手动将自定义的 apolloClient 实例赋值给 Nuxt 应用的默认 Apollo 客户端。
   * 这将完全覆盖 Nuxt Apollo 模块的默认客户端配置,确保我们的自定义设置生效。
   */
  // nuxtApp.hook('apollo:auth', ({ client, token }) => {
  //   // 此钩子应被移除或注释,因为它与自定义 Auth Link 冲突
  //   // token.value = wooSession.value;
  // });
  nuxtApp._apolloClients.default = apolloClient;
});

在上述代码中,authLink 使用 setContext 来动态地为每个请求添加 Authorization 和 woocommerce-session 这两个请求头。afterware 则负责从响应中提取 woocommerce-session 头并更新本地 Cookie。最关键的是,通过 nuxtApp._apolloClients.default = apolloClient; 这一行,我们直接用自定义的客户端替换了 Nuxt Apollo 模块默认创建的客户端,从而获得了完全的控制权。

XFUN
XFUN

小方智能包装设计平台

下载

2. Nuxt 配置文件 (nuxt.config.ts) 调整

由于我们已在插件中完全自定义了 Apollo Client,nuxt.config.ts 中的 apollo 模块配置应进行精简。特别是,与认证相关的 authType、authHeader 和 tokenStorage 等选项应被移除或注释掉,以避免与自定义逻辑产生冲突。

import { defineNuxtConfig } from 'nuxt/config';

export default defineNuxtConfig({
  // ... 其他 Nuxt 配置

  apollo: {
    // 移除或注释掉所有与认证相关的全局配置,
    // 因为认证逻辑已完全在 apollo.js 插件中处理。
    // authType: 'Session',
    // authHeader: 'woocommerce-session',
    // tokenStorage: 'cookie',
    // tokenName: 'woocommerce-session',

    clients: {
      default: {
        // 仅保留 HTTP 端点配置,确保与插件中的 httpLink.uri 一致
        httpEndpoint: process.env.PUBLIC_GRAPHQL_URL,
        httpLinkOptions: {
          credentials: 'include' // 如果需要发送 Cookie,请保留此选项
        }

        // 移除或注释掉客户端特定的 JWT 认证配置
        // authType: 'Bearer',
        // authHeader: 'Authorization',
        // tokenStorage: 'cookie'
      }
    }
  }
});

通过以上调整,nuxt.config.ts 的 apollo 配置将变得非常简洁,主要用于定义默认客户端的 HTTP 端点和其他非认证相关的通用设置。

注意事项与总结

  1. 完全控制与责任: 这种方法赋予了你对 Apollo Client 的完全控制权,但也意味着你需要自行管理所有认证逻辑,包括令牌的存储、刷新、过期处理以及请求头的动态设置。
  2. Cookie 管理: 使用 useCookie 管理 JWT 和会话 ID 是 Nuxt3 中推荐的方式,它能很好地支持 SSR (Server-Side Rendering) 和 CSR (Client-Side Rendering) 场景。确保 Cookie 的 maxAge、sameSite 和 secure 属性设置正确,以保障安全性。
  3. 错误处理: 在 authLink 中,你可以添加额外的逻辑来处理令牌过期的情况,例如重定向到登录页或尝试刷新令牌。
  4. 适用场景: 当 Nuxt Apollo 模块的内置认证机制无法满足你的复杂需求(例如需要多个动态请求头、复杂的令牌刷新流程或与特定后端系统深度集成)时,这种自定义方法非常有效。对于简单的单令牌认证场景,Nuxt Apollo 的默认配置可能更为便捷。

通过上述步骤,你可以在 Nuxt3 应用中成功地集成 Nuxt Apollo,并灵活地处理多重认证请求头,无论是访客会话管理还是用户登录后的 JWT 认证,都能在一个 Apollo Client 实例中无缝协作。这种方法提供了一个强大且可扩展的解决方案,适用于复杂的无头电商或内容管理系统。

相关专题

更多
Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

3

2026.01.21

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6422

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

345

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

314

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

745

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 6.9万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号