使用 CORS 在浏览器中设置 httpOnly cookie 的正确方法是什么?

时间:2021-03-08 12:37:05

标签: javascript reactjs cookies fetch cross-domain

我有一个在 https://foo.test.com 上运行的节点 js 服务器,其中身份验证 API 返回一个 httpOnly cookie,当站点位于 https://bar.test.com 时,该 cookie 未在浏览器中设置。

从服务器端设置cookie:

ctx.cookies.set('foo', 'bar', {
  httpOnly: true,
  maxAge: 8.64e+7,
  sameSite: 'strict',
  secure: true,
  domain: 'test.com',
});

CORS 配置

app.use(cors({
    origin: 'https://bar.test.com',
    credentials: true,
})).use(bodyParser()).use(jwt).use(router.routes());

客户端认证api

fetch('/validate-otp', {
  method: 'PUT',
  headers: {
     Accept: 'application/json',
     'Content-Type': 'application/json',
   }, 
  credentials: 'include',   
})

我已经在服务器上设置了一个测试 API,以查看 cookie 是否设置为如下所示的标头,即使它暂时不起作用。

fetch('/test', {
  method: 'GET',
  headers: {
    Accept: 'application/json',
    'content-Type': 'application/json',
  },
  credentials: 'include',
});

在浏览器中,我可以看到我收到了带有响应的 cookie,但它没有被设置。 Inspect -> NetworkInspect -> Application -> Cookies

如何在浏览器中正确设置 httpOnly cookie,以便我可以将其作为未来服务器请求的标头发送?

2 个答案:

答案 0 :(得分:0)

cookie 设置后会自动附加到所有请求。我首先更改 maxAge。由于测量单位是毫秒,因此您的 cookie 将不足以发送 (60*60ms = 3600ms = 3.6s),可能类似于 maxAge: 8.64e+7 - 对应于 24 小时 - 可以工作。

httpOnly 属性会阻止任何客户端 javascript 访问它,但对于您这样的身份验证目的,这是一种合理的行为。

答案 1 :(得分:0)

在深入挖掘之后,我解决了我的问题,将用于从服务器获取 cookie 的身份验证 API 的获取方法从“PUT”更改为“POST”。

相关问题