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

Rails API+NextJS跨域场景下Set-Cookie不生效无法读取问题求助

解决方案步骤

1. 修正NextJS侧fetch请求配置

跨域请求需要携带/接收凭证时,credentials参数必须设置为include,你之前用的same-origin仅在同域请求时生效,完全不匹配跨域场景:

return fetch(`${PublicApiUrl}/auth/login.json?${qs.stringify(options)}`, {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
  credentials: 'include' // 替换原有配置,仅需这一个值即可
})

注意:前端JS永远无法读取httpOnly属性的Cookie,也无法通过fetch API拿到Set-Cookie响应头,这是浏览器的安全限制,和你的配置无关,不需要再尝试打印这两个值做调试。

2. 修正Rails侧Cookie设置逻辑

Cookie的domain属性不支持携带端口,你当前设置的localhost:5000属于非法值,浏览器会直接丢弃该Cookie:

response.set_cookie(
  "withIP",
  {
    value: auth_token[:token],
    expires: 30.minutes.from_now,
    path: "/",
    domain: "localhost", // 只写域名,不要带端口,开发环境直接填localhost即可
    secure: Rails.env.production?,
    httponly: true
  }
)

3. 检查Cookie的存储位置

该Cookie是Rails服务(端口3000)写入的,属于http://localhost:3000域下的资源,你需要在Chrome开发者工具的Application -> Storage -> Cookies -> http://localhost:3000路径下查看,不要找5000端口的Cookie列表。

4. 可选:简化Rack-CORS配置

Set-Cookie属于浏览器保留响应头,即使你配置了expose也不会暴露给前端JS,可以直接删掉expose数组里的Set-Cookie项,不影响Cookie的自动存储。


内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:27:03