当CORS Access-Control-Allow-Origin设置为(*)

时间:2019-07-10 14:53:03

标签: node.js api cookies browser cors

我正在使用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?

谢谢

2 个答案:

答案 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。