【发布时间】:2020-03-13 23:45:27
【问题描述】:
当我在浏览器的控制台(在开发人员工具中)使用以下 js sn-p 时(尝试使用 chrome、firefox 和 edge),在获取发送 cookie 时遇到问题:
fetch('http://127.0.0.1:3010/check', {
credentials: 'include'
method: 'GET'
})
.then(res=>res.json())
.then(jsonobj=>{console.log(jsonbj)});
这是我处理 api 请求的快速代码:
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var cors = require('cors');
var app = express();
app.use(cors({
credentials: true,
origin: 'https://www.youtube.com'
));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.get('/check', (req, res)=>{
console.log(JSON.stringify(req.cookies));
res.json({
message: "COOL"
});
});
获取调用成功,消息 COOL 被记录到浏览器控制台。但是,NodeJS 控制台会打印空对象 {} 或空 cookie。
例如,当我在http://youtube.com/的控制台中运行获取请求时,我希望浏览器将我本地主机上的cookie发送到我的快递服务器(我这样做是为了模拟cookie发送在跨站点请求中)。
编辑 1:我的本地主机上的一些 cookie 也未设置 SameSite,并且 mdn 文档说这些 cookie 也可以通过跨站点请求发送到服务器:
标志未设置或不支持时的默认行为 浏览器,是在任何请求中包含 cookie,包括 跨域请求。
mdn 文档中的 sn-p 错误或浏览器对 SameSite 的实现不一致。我很困惑。
EDIT 2:这个页面https://textslashplain.com/2019/09/30/same-site-cookies-by-default/ 说
在 Chrome 80 及更高版本中,cookie 将默认为 SameSite=Lax。这 意味着 cookie 将仅在第一方自动发送 除非他们通过明确设置无指令来选择退出:
mdn 文档关于 SameSite 的默认值真的不正确吗?
编辑 3:我已提议对 mdn 文档进行编辑,并已被接受。
【问题讨论】:
-
这看起来不正确:
headers: { credentials: 'include' }。相反,headers和credentials都是单独的参数。它应该是credentials: 'include'(并且可以跳过headers,因为您似乎没有任何额外的标题)。如果这能解决您的问题,请告诉我,我会根据此评论做出回答。
标签: javascript node.js cookies cross-domain