为什么我的 CORS 获取请求没有向服务器发送 cookie?

时间:2021-04-09 22:47:00

标签: javascript express cookies fetch cross-domain

我有一个使用 fetch 的相当简单的 CORS 请求:

    fetch('https://foobar.com/auth', {
      method: 'GET',
      mode: 'cors',
      credentials: 'include',
    })

express 处理这个服务器端;我通过 CORS 保护一条路线的代码如下所示:

app.get('/auth', cors({
    origin: [
        'http://localhost:8080',
        'http://127.0.0.1:8080'
    ],
    credentials: true,
    preflightContinue: true
}), (req, res) => {
    const { jwt } = req.cookies;
    console.log('JWT is: ', jwt);
    res.json({ jwt });
});


但是,响应始终为空,它无法从请求中检索 cookie 并将其在 json 响应中发回。

在浏览器开发工具中,我在响应标头中看到了这一点:

access-control-allow-credentials: true
access-control-allow-origin: http://127.0.0.1:8080

(我也尝试过使用 localhost,但这不起作用,有人建议使用 IP,我不知道)。

如果我直接访问服务器,在 /auth 路由上,我会返回带有 JWT 令牌的 JSON,所以我知道它存储为每次来回传递的 cookie,并且可以看到它在浏览器开发工具的 cookie 中。

{"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwcm9maWxlIjp7InByb3ZpZGVyIjoiZ29vZ2xlIiwic3ViIjoiMTEzNjM2ODYxNzQ0NDM2MzEyMTc2IiwiaWxxxx1lIjoiQ2hyaXMiLCJmYW1pbHlOYW1lIjoiRGF3c29uIn0sImdpdmVuX25hbWUiOiJDaHJpcyIsImZhbWlseV9uYW1xxxxxxxoMTRHamdLNERSeld0Nk1GV2JGVDBra0k2MlRLLU53dmR6aWNmNWxXVW9mMEk9czk2LWMiLCJ0eXBlIjoiZGVmYXVsdCJ9XSwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdqZ0s0RFJ6V3Q2TUZXYkxxxxxI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdqZ0s0RFJ6V3Q2TUZXYkZUMGtrSTYyVEstTnxxxxFsZSI6ImVuLUdCIn19LCJpYXQiOjE2MTgwMDcwNzJ9.kaRH97GyIjgfdbfhOO4zaMLrZKD7bRV23wpAvd4v-As"}

我在响应头中也看到了这一点:

set-cookie: connect.sid=s%3As-DAIzZjWT4C3xxxxxuAUgE; Path=/; HttpOnly; Secure

我应该查看 JWT 的 set-cookie 吗?我假设它不需要重新设置它,但我不清楚这是否表明服务器没有正确设置它,然后检索它,然后将它发送回 CORS 请求。

我的理解是,要完成这项工作,我只需要:

  1. 在服务器端设置 cors 以正确设置 access-control-allow-origin 标头。
  2. 从正确的来源发送我的请求。
  3. 在请求中指定我需要允许凭据来获取 cookie(在我的 fetch 调用中使用 credentials:true,它在请求本身中设置 access-control-allow-headers

1 个答案:

答案 0 :(得分:0)

问题是 express 没有正确创建 cookie。它需要使用 sameSite: 'none' 作为选项创建,以便 CORS 请求使用它。

List<String> result = ids.stream().map(s -> s.split("-"))
        .sorted(Comparator.comparing((String[] a) -> a[0])
                .thenComparingInt(
                        a -> Integer.parseInt(a[1])))
        .map(a -> String.join(",", a))
        .collect(Collectors.toList());