我正在使用Node.js和Express构建一个API,以期用户可以通过API调用来访问它,并充当我的Web应用程序(React.js)的RESTFUL后端。
由于这个原因,我将CORS Access-Control-Allow-Origin
设置为通配符(*),因为应该可以从外部源对其进行访问。
当前,API在localhost:8000上运行,而Web应用在localhost:3000上运行。
现在,我想在访问/login
端点时设置一个cookie。 cookie不用于身份验证,因此我不必担心CSRF。
我正在这样设置cookie:
res.cookie('token', 'value', {httpOnly:true});
当我使用Postman时,cookie设置没有问题,但是当尝试通过浏览器通过我的web应用程序访问cookie时,
就没有设置。在阅读了有关Stack Overflow的几篇文章之后,我了解到从Web应用程序执行提取操作时需要设置credentials: include
。
问题是,如果Access-Control-Allow-Origin
设置为(*),则不允许在浏览器中使用。
在这种情况下,是否可以在浏览器上设置cookie?
谢谢
答案 0 :(得分:2)
https://security.stackexchange.com/questions/198714/access-control-allow-origin-wildcard-doesnt-allow-sending-session-cookies出于某些背后的原因,请参阅stackexchange上的此答案,但基本上没有,您不能。
如果您需要带有凭据的api,则还应该了解所有可能获得这些凭据的来源。将allow-origin设置为您的localhost和/或开发服务器,以及最终的生产地址,如下所示。
我假设您在NodeJS服务器上使用cors
软件包。
它也应该配置为接受cookie。对于Express Server,它看起来像这样。
app.use(cors({
origin:["http://localhost:3000"],
credentials:true
}));
此外,正如您正确说的那样,您还将凭据以及任何UI边调用发送到API。
答案 1 :(得分:-1)
我做到了这一点(我正在使用NPM的cors软件包):
app.use(cors({
origin:true,
credentials:true
}));
根据docs:
起源:配置Access-Control-Allow-Origin CORS标头。 可能的值:
Boolean - set origin to true to reflect the request origin, as defined by req.header('Origin'), or set it to false to disable CORS.
这使得cors本质上可以接受基于请求标头的任何来源,同时还允许设置cookie。