Node.js Cookie不会保存在浏览器中
首先,我想说,我已经阅读了关于这个问题的几乎所有内容,到目前为止还没有解决方案 简而言之,我有一个Node.js API服务器运行在localhost:3000上。我还有一个Angular 10应用程序在localhost:4200上运行。问题很简单-我向localhost:3000/api/users/login发出请求,并收到以下信息: 但是,没有保存cookie,您可以在此处看到: 因此,每个后续请求(无论是POST还是GET)都没有标题,服务器无法识别用户。 到目前为止,我试过:Node.js Cookie不会保存在浏览器中,node.js,angular,express,cookies,jwt,Node.js,Angular,Express,Cookies,Jwt,首先,我想说,我已经阅读了关于这个问题的几乎所有内容,到目前为止还没有解决方案 简而言之,我有一个Node.js API服务器运行在localhost:3000上。我还有一个Angular 10应用程序在localhost:4200上运行。问题很简单-我向localhost:3000/api/users/login发出请求,并收到以下信息: 但是,没有保存cookie,您可以在此处看到: 因此,每个后续请求(无论是POST还是GET)都没有标题,服务器无法识别用户。 到目前为止,我试过: 将
- 将{withCredentials:true}包含到来自
- 将cookie更改为http:false
- 将Cookie中的域设置为各种内容,如“.app.localhost”
- 将sameSite:“无”添加到cookie
- 正在运行API的localhost:3000上搜索cookie
- 将cors中的原点更改为“*”或将其完全删除
- 在Edge中也尝试了所有这些东西(否则我使用Chrome)
const app = express();
app.use(express.json());
app.use(cookieParser(config.cookieSecret));
app.use(express.static(path.resolve(__basedir, 'static')));
app.use(cors({
origin: config.origin,
credentials: true
}));
app.use('/api', apiRouter);
app.use(errorHandler);
这是我在其中设置cookie的登录处理程序:
async function login(req, res, next) {
const { email, password } = req.body;
try {
let user = await User.findOne({ email });
const match = await user.matchPassword(password);
if (!match) {
res.status(401)
.send({ message: 'Wrong username or password' });
return
}
user = bsonToJson(user);
const token = utils.jwt.createToken({ id: user._id });
if (process.env.NODE_ENV === 'production') {
res.cookie(authCookieName, token, { httpOnly: true, sameSite: 'none', secure: true })
} else {
res.cookie(authCookieName, token, { httpOnly: true })
}
res.status(200).send(user);
} catch (err) {
next(err);
}
}
这是有角度的部分:
loginMet(data) {
return this.http.post('http://localhost:3000/api/users/login', data, {withCredentials: true});
}更新 经过测试,chrome(86.0.4240.198)似乎仍然允许在
localhost
上使用跨站点cookie,这意味着您的问题不是由新的限制引起的,使用{useCresidences:true}
应该可以正常工作
首字母
对于被认为具有相同来源的两个位置,协议、域和端口必须相同。在您的情况下,您有(localhost:3000和localhost:4200)和cookies不能在Safari、Firefox和Chrome中的不同来源之间共享
你可以阅读更多关于这个主题的文章
在本地,您可以尝试通过创建proxy.config.json来解决此问题,以便webpack dev服务器充当后端的代理。因此,所有对localhost:3000的请求都将被发送到localhost:4200。你可以阅读更多关于它的内容
另一个可以在本地和生产环境下工作的解决方案(如果您不会从与API服务器相同的服务器为angular应用程序提供服务)是为各个应用程序提供一个域和两个子域。在本地,您可以通过更新来完成此操作,在生产时,当然这将由DNS服务器完成。user1的回答部分正确 截至2020年2月,RFC 6265更改了“HTTP状态管理机制”。 cookie现在以默认值LAX存储,这将强制浏览器不向第三方提供cookie Firefox v69和Google Chrome(大约一年后)在80版中采用了这一技术 要避免这种情况,必须在创建cookie时设置以下内容: SameSite=无 安全=正确 注意:这些道具只能在开发模式中使用,因为它们在某种程度上使客户端暴露于漏洞 资料来源:
感谢您提供的资源,不幸的是,在src/文件夹中创建proxy.config.json并将其添加到angular.json->“architect”->“service”->“options”->“proxyConfig”之后,angular站点中编写的“src/proxy.config.json”对我不起作用。我使用了这里给出的默认配置,只是更改了目标,因为在我的例子中,API位于端口3000上。我也试过他们的,目标是3000,但还是没有成功。我的配置文件如下所示:{“/api”:{“target”:“,“secure”:false}}使用默认配置不会自动为您工作。你必须摆弄一下配置。尝试将json更改为js文件,如图所示,然后尝试或。我发现了问题所在。{withCredentials:true}由于某些原因无法与http.post一起使用。当我更改方法以同时在服务器和服务器中获取时,请求头被发送。代理帮助我。我的代理配置文件如下:{“/api”:{“target”:“,“secure”:false}}现在我的请求转到localhost:4200/api而不是localhost:3000/api,代理重定向到正确的地址。谢谢你,伙计!通常,当您拥有安全连接(HTTPS)时会使用该标志。感谢您提供的信息。当使用{withCredentials:true}时,问题确实得到了解决。我不知道为什么我第一次尝试时它不起作用。没有对代码进行进一步更改。