首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >CORS:当credentials标志为true时,不能在Access-Control-Allow-Origin中使用通配符

CORS:当credentials标志为true时,不能在Access-Control-Allow-Origin中使用通配符
EN

Stack Overflow用户
提问于 2013-11-02 23:18:29
回答 10查看 551.7K关注 0票数 393

我有一个设置,包括

前端服务器(Node.js,domain: localhost:3000) <->后端(Django,Ajax,domain: localhost:8000)

浏览器<-- webapp <-- Node.js (为应用程序提供服务)

浏览器(webapp) --> Ajax --> Django(服务ajax POST请求)

现在,我这里的问题是CORS设置,webapp使用它来对后端服务器进行Ajax调用。在chrome中,我不断地得到

当凭证标志为true时,

不能在访问控制允许源中使用通配符。

在firefox上也不起作用。

我的Node.js设置是:

代码语言:javascript
复制
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'http://localhost:8000/');
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
};

在姜戈,我使用的是this middleware along with this

webapp发出的请求如下:

代码语言:javascript
复制
$.ajax({
    type: "POST",
    url: 'http://localhost:8000/blah',
    data: {},
    xhrFields: {
        withCredentials: true
    },
    crossDomain: true,
    dataType: 'json',
    success: successHandler
});

因此,webapp发送的请求头如下所示:

代码语言:javascript
复制
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: "Origin, X-Requested-With, Content-Type, Accept"
Access-Control-Allow-Methods: 'GET,PUT,POST,DELETE'
Content-Type: application/json 
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=***; sessionid="***"

下面是响应头:

代码语言:javascript
复制
Access-Control-Allow-Headers: Content-Type,*
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
Content-Type: application/json

我哪里错了?!

编辑1:我一直在使用chrome --disable-web-security,但现在我希望它能正常工作。

编辑2:答案:

因此,针对我的django-cors-headers配置的解决方案:

代码语言:javascript
复制
CORS_ORIGIN_ALLOW_ALL = False
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000' # Here was the problem indeed and it has to be http://localhost:3000, not http://localhost:3000/
)
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-11-03 01:31:57

这是安全的一部分,你不能那样做。如果您希望允许凭据,则您的Access-Control-Allow-Origin不能使用*。您必须指定确切的协议+域+端口。有关参考,请参阅以下问题:

  1. Access-Control-Allow-Origin wildcard subdomains, ports and protocols
  2. Cross Origin Resource Sharing with Credentials

此外,*过于宽松,会使凭据的使用失效。因此将http://localhost:3000http://localhost:8000设置为allow origin header。

票数 309
EN

Stack Overflow用户

发布于 2017-08-26 08:30:16

如果您正在使用CORS中间件,并且您想要发送withCredential布尔值true,您可以这样配置CORS:

代码语言:javascript
复制
var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:3000'}));
票数 62
EN

Stack Overflow用户

发布于 2020-10-24 00:47:21

在@Renaud idea的基础上扩展,cors现在提供了一种非常简单的方法来做到这一点:

从cors官方文档中找到here

“origin:配置Access-Control-Allow-Origin CORS头部。可能的值: Boolean -将origin设置为true以反映请求来源,如req.header(' origin ')所定义,或设置为false以禁用CORS。”

因此,我们只需执行以下操作:

代码语言:javascript
复制
const app = express();
const corsConfig = {
    credentials: true,
    origin: true,
};
app.use(cors(corsConfig));

最后,我认为值得一提的是,在某些用例中,我们希望允许来自任何人的跨域请求;例如,在构建公共REST API时。

注:我本想把这篇文章作为对他的回答的评论,但不幸的是,我没有名誉点。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19743396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档