NodeJS中使用graphql-ws实现GraphQL订阅时添加HTTP升级授权头
要解决握手时HTTP升级请求的Cookie头添加问题,核心是在WebSocket连接初始化时直接配置HTTP请求头,graphql-ws允许通过自定义WebSocket实现来完成这个操作,具体步骤如下:
实现方案
- 如果你是Node环境,先确保安装了
ws库(graphql-ws在Node端依赖它创建WebSocket连接):
npm install ws
- 创建客户端时,通过
webSocketImpl选项自定义WebSocket实例,在构造时传入包含Cookie的headers配置:
import { createClient } from 'graphql-ws'; import WebSocket from 'ws'; // 替换成你的GraphQL订阅地址和实际授权Cookie const SUBSCRIPTION_URL = 'ws://your-graphql-server/subscriptions'; const AUTH_COOKIE = 'auth-token=your-actual-token-value'; const client = createClient({ url: SUBSCRIPTION_URL, webSocketImpl: (url, protocols) => { return new WebSocket(url, protocols, { headers: { Cookie: AUTH_COOKIE, }, }); }, });
关键说明
- 不要混淆
connectionParams和HTTP握手头:connectionParams是GraphQL WS协议的连接初始化参数,会在WebSocket建立后以消息形式发送,不会出现在HTTP升级请求头中,所以无法满足服务器对握手阶段Cookie的验证要求。 - 如果你的授权令牌是动态获取的(比如从登录接口返回),只需将
AUTH_COOKIE替换为动态生成的字符串即可,比如从缓存或变量中读取最新令牌。
内容的提问来源于stack exchange,提问作者aman bhardwaj
相关产品推荐
相关产品推荐

