Apollo Server Lambda返回400 Invalid cookie value 客户端请求失败但Studio正常
解决方案
原因定位
该报错的核心原因是服务端的Cookie解析中间件检测到请求携带的Cookie中存在不符合RFC规范的未编码特殊字符,Apollo Studio请求正常是因为它的请求上下文不会携带你本地站点(http://localhost:8080)下存储的非规范Cookie(比如请求头里的g_state={"i_l":0},包含未编码的大括号、双引号),而本地客户端发起请求时会自动携带所有同域Cookie,触发了校验失败。
具体修复方案
- 方案1:禁用服务端Cookie解析的严格模式
在Apollo Server Lambda的express中间件配置中,自定义Cookie解析逻辑,关闭严格校验即可:import cookieParser from 'cookie-parser'; return apolloServer.createHandler({ expressGetMiddlewareOptions: { cors: { origin: ['http://localhost:8080', 'https://studio.apollographql.com'], credentials: true, }, // 自定义中间件替换默认的cookie parser app: (app) => { app.use(cookieParser(/* 如有签名密钥可填在此处 */, { // 关闭严格模式,允许非规范字符的Cookie strict: false })); } } })(event, context, callback) - 方案2:修正非规范Cookie的存储逻辑
排查本地站点中设置g_state这类Cookie的逻辑,存储前对值进行encodeURIComponent编码,读取时做decodeURIComponent解码,确保所有Cookie的值都符合RFC 6265的字符规范。 - 方案3:本地开发环境调整Cookie配置(可选)
本地开发时请求走的是HTTP协议,secure: true的Cookie仅在HTTPS协议下生效,可根据环境动态调整Cookie配置避免后续其他Cookie相关问题:const isProd = process.env.NODE_ENV === 'production'; setCookies.push({ name: "cookieName", value: "cookieContent", options: { httpOnly: true, maxAge: 3600, path: "/", sameSite: isProd ? 'none' : 'lax', secure: isProd } });
内容的提问来源于stack exchange,提问作者Bdanzer
相关产品推荐
相关产品推荐

