我在 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"获取文件到