如何在adonis中获取第三方cookie?解决request.cookies()取值问题
问题根因
出现request.cookies()仅能返回Adonis自身设置Cookie的现象,核心由两层逻辑导致:
- 现代浏览器默认的安全拦截规则,会阻断跨站/跨域请求下的第三方Cookie携带行为
- Adonis框架默认的Cookie解析逻辑会对所有读取到的Cookie做签名校验,没有匹配当前应用密钥的合法签名的第三方Cookie,会被框架直接过滤丢弃,不会出现在
request.cookies()的返回值中
跨域浏览器交互场景的配置打通
- 配置Adonis内置的CORS规则:必须开启
credentials: true,同时origin字段不能配置为通配符*,需要显式列出所有允许的跨域源站,否则浏览器会直接拦截带凭证的跨域响应 - 跨站交互的Cookie属性配置:绝对不要沿用框架默认的
sameSite: 'lax'配置,否则跨站请求触发时浏览器会直接过滤掉对应Cookie。这类跨站可携带的Cookie必须设置sameSite: 'none'、secure: true,示例配置如下:response.cookie('shared_token', tokenValue, { sameSite: 'none', secure: true, domain: '.common-parent-domain.com' }) - 前端请求侧强制配置:无论使用fetch还是HTTP请求客户端,必须开启请求凭证携带开关,例如fetch需要设置
credentials: 'include',axios需要设置withCredentials: true
绕过框架过滤读取全量Cookie
- 直接调用
request.plainCookies属性读取全量Cookie,该方法不会对Cookie做签名校验,可获取所有随请求携带的Cookie(包含第三方来源),示例:const thirdPartyCookieValue = request.plainCookies.get('目标第三方Cookie的键名') - 如果需要获取完全未解析的原始Cookie字符串,可直接从请求头读取:
const rawCookieString = request.header('cookie', '')
服务端透传第三方Cookie
读取到第三方Cookie值后,向下游服务转发时,直接将对应键值对拼入下游请求的Cookie请求头即可,无需依赖框架的Cookie序列化逻辑。
常见踩坑提醒
- 非HTTPS环境下,浏览器会直接拒绝携带
SameSite=None属性的Cookie,不要在本地HTTP环境开展跨站Cookie携带测试 - 如果两个交互站点属于独立无关联的主域名(不存在公共父域),无法通过浏览器自动携带跨主域的第三方Cookie,这类场景必须依靠后端服务间直连透传Cookie值
- 现代浏览器默认开启的第三方Cookie拦截策略会直接阻断跨站请求的Cookie携带,测试时需要临时调整浏览器的站点权限配置
内容的提问来源于stack exchange,提问作者Prerana
相关产品推荐
相关产品推荐

