google-chrome - 本地主机 Web 应用程序访问远程 API 时未设置 Cookie

我在 http://localhost:3000 上提供了一个 React 网络应用程序。

此网络应用访问远程 API,即 https://app.example.com/api

当在 API 上执行登录时,服务器返回一个像这样的 session Cookie:

Set-Cookie: JSESSIONID=ZmQ2Yzg4OWYtYzdiNi00Mzc1LTkzMzUtYzhiZjZmM2MzZjMy; Domain=app.example.com; Path=/api/; Secure; HttpOnly; SameSite=Lax

但是,在 Chrome 上,Set-Cookie 不会出现在响应 header 列表中。此外,如果我重新发送相同的请求,Chrome 不会在请求 header 中包含 Cookie。

所以,我的理解是它忽略了 Cookie。为什么?

关于 CORS,我没有发现任何问题,并且 Chrome 正确发送了请求。以下是预检中返回的 CORS header :

Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: PATCH,GET,POST,PUT,DELETE
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Expose-Headers: ETag, X-XSRF-TOKEN

我尝试添加本地 DNS 条目 app.me 指向 127.0.0.1 但仍然不起作用。

我也尝试过使用 Edge,我可以看到出现了 Set-Cookie header ,但是,cookie 似乎也没有设置。


编辑:

这是 Axios 代码:

const axios = require('axios');

const backendUrl = 'https://app.example.com/api';
const constructUrl = url => `${backendUrl}${url}`;

const axiosConfig = {
  withCredentials: true,
};

export default {
  get: url => axios.get(constructUrl(url), axiosConfig),
  post: (url, data) => axios.post(constructUrl(url), data, axiosConfig),
  put: (url, data) => axios.put(constructUrl(url), data, axiosConfig),
  delete: (url, data) => axios.delete(constructUrl(url), data, axiosConfig),
};

//And in a different file...

HttpService.post('/login', creds)
        .then((response) => {
          const userInfo = response.data;
          const token = response.headers['x-xsrf-token'];
          sessionStorage.setItem('user-info', JSON.stringify(userInfo));
          sessionStorage.setItem('user-xsrf-token', JSON.stringify(token));

          window.location.replace('/');
        })
        .catch((err) => {
          if (err.response.status === 401) {
            setLoginError('Bad cred');
          } else {
            setLoginError('Fail to auth');
          }
        });

最佳答案

首先,出于某种原因,我无法让 Chrome 显示与地址栏中提到的域以外的其他域关联的 cookie。因此,在地址栏内,我有 http://localhost:3000,但我看不到与 app.example.com 关联的 cookie。 此外,出于同样的原因,开发工具不会显示 Set-Cookie(响应)和 Cookie(请求)。但这并不意味着没有收到和设置 cookie。

但是,在我的例子中,由于 SameSite=Lax 的存在,cookie 没有被设置。

删除此 cookie 属性后,将设置 cookie 并将其包含在下一个请求中。

https://stackoverflow.com/questions/56372570/

相关文章:

docker - 无法使用 docker login --password-stdin

node.js - 在 Nexus 中获取最新版本的 Node 包

python - Jupyter 笔记本 : how to run python shell com

python-3.x - 如何在 Python 中创建具有每个变量值之间差距的堆积条形图

google-sheets - 具有日期条件的 Google 表格摘要

python - 无法编码响应 : datetime. datetime(2019, 5, 29,

python - 是否可以在 Snakemake 中有一个可选的输出文件?

google-drive-api - 从 Google Drive "Computers"获取文件到

reactjs - 我们如何在使用 react 最终形式时在组件中设置状态

c# - 从不同的项目 .Net 访问 protobuf