Cors - 此 set-cookie 域属性对于当前主机 url 无效

Pro*_*roV 3 javascript ajax xmlhttprequest node.js

我有一个节点后端,它应该允许来自我在 localhost:3000 上运行的前端应用程序的跨源请求。因此,我已将 cors 策略限制在我的域中。

import csrf from 'csurf';

app.use(
  cors({
    origin: 'http://localhost:3000',
    credentials: true
  })
);

const csrfProtection = csrf({
  cookie: {
    maxAge: 900,
    domain: 'http://localhost:3000'
  }
})

router.get('/csrfToken', csrfProtection, async (req, res, next) => {
  res.json({ token: req.csrfToken() });
});
Run Code Online (Sandbox Code Playgroud)

当我现在向我的服务器端点(在 localhost:5000 上运行)发出请求时,它向我返回以下错误,即无法设置 cookie。

  fetch('http://localhost:5000/csrfToken', {
      method: 'GET',
      credentials: 'include'
 })
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 在此处输入图片说明

Que*_*tin 6

这与 CORS 无关。这就是 cookie 的工作原理。


set-cookie标头中的域表示,http://localhost:3000但请求是针对http://localhost:5000.

这是一个不同的来源,因此是一个无效的 cookie。


set-cookie来自一个源的标头不可能为不同的源设置 cookie。http://localhost:5000只能为 设置 cookie http://localhost:5000


如果您真的想设置 cookie,:3000那么解决方法是通过 cookie 以外的其他格式(例如在请求正文中)提供数据,然后让客户端 JShttp://localhost:3000使用文档设置 cookie 。饼干 API

如果您想为:5000(这似乎更有可能)设置 cookie,请在set-cookie标题中获取正确的端口号。

const csrfProtection = csrf({
  cookie: {
    maxAge: 900,
    domain: 'http://localhost:5000'
  }
})
Run Code Online (Sandbox Code Playgroud)

  • @ProV — 尝试将“domain”排除在外并信任默认值。 (2认同)