You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RTK Query设置credentials:include后后续请求未携带Cookie问题

RTK Query fetchBaseQuery配置credentials: 'include'后未携带Cookie的问题排查与解决

问题背景

我在使用Redux-Toolkit (RTK) Query时,已经为fetchBaseQuery配置了credentials: "include"来让请求携带Cookie,配置代码如下:

const baseQuery = fetchBaseQuery({
  baseUrl: `${import.meta.env.VITE_SERVER}`,
  prepareHeaders(headers) {
    return headers;
  },
  credentials: "include",
});

export const baseApi = createApi({
  baseQuery: baseQuery,
})

登录POST请求后,服务器返回的响应头包含Set-Cookie字段:

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: http://localhost:5173
Vary: Origin
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: Set-Cookie
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
Set-Cookie: token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY0Yzg4OTU1YWUxODgwZjJmYzM1NmNjMSIsImlhdCI6MTY5MDg2NTIyMiwiZXhwIjoxNjkwODY2MTIyfQ.X_jNxlInBjaIkqevoaryDYDxSC15Qc9YBNjgdM9XpOs; Path=/; HttpOnly; Secure; SameSite=None
Content-Type: application/json; charset=utf-8
Content-Length: 308
Connection: keep-alive
Keep-Alive: timeout=5

但后续所有请求都没有携带Cookie,示例请求头如下:

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: vi-VN,vi;q=0.9,fr-FR;q=0.8,fr;q=0.7,en-US;q=0.6,en;q=0.5
Connection: keep-alive
DNT: 1
Host: localhost:3000
Origin: http://localhost:5173
Referer: http://localhost:5173/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site

原因分析

从返回的Set-Cookie属性来看,核心问题出在**Secure标记**:

  • Secure属性要求Cookie只能通过HTTPS协议传输,但你的前端运行在http://localhost:5173(HTTP协议)下,浏览器会直接忽略这个Cookie,不会存储到本地,自然后续请求也无法携带。
  • 另外SameSite=None必须配合Secure使用,但本地HTTP环境下Secure不生效,导致整个Cookie的存储逻辑失效。

解决步骤

1. 本地开发环境临时调整Cookie配置

修改服务器端的Set-Cookie输出,去掉Secure属性,或者仅在生产环境(HTTPS)下添加Secure:

// 示例:Express服务器中根据环境配置Cookie
res.cookie('token', token, {
  path: '/',
  httpOnly: true,
  secure: process.env.NODE_ENV === 'production', // 仅生产环境启用Secure
  sameSite: process.env.NODE_ENV === 'production' ? 'None' : 'Lax'
});

2. 验证fetchBaseQuery配置有效性

确认credentials: "include"确实被正确应用:

  • 检查baseUrl是否和请求的服务器地址完全匹配(包括端口),避免跨域配置不一致。
  • prepareHeaders方法没有修改或移除credentials相关配置(你的当前代码没问题,只是返回headers,不会影响)。

3. 可选:本地启用HTTPS

如果需要在本地测试SecureCookie,可以给前端项目启用HTTPS:

  • Vite项目可以通过vite.config.js配置:
import { defineConfig } from 'vite';

export default defineConfig({
  server: {
    https: true
  }
});

启动后前端地址变为https://localhost:5173,此时服务器返回的SecureCookie就能被正确存储。

内容的提问来源于stack exchange,提问作者VN-Boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:21:04