Ajax 授权标头不适用于cors

Ajax 授权标头不适用于cors,ajax,api,cors,cross-domain,fetch,Ajax,Api,Cors,Cross Domain,Fetch,我已经面对这个问题好几天了。我正在尝试从我的网站(mywebsite.com)调用我的API(API.mywebsite.com),在我尝试通过授权头之前,它工作正常。在这一点上,它不再是一个简单的请求,而是一个预飞行请求 但是,在最后,不会发送auth头,我得到的输入是: 这是我的前端代码(JS): 虽然这是API后端中的中间件: //Allow the cors from every domain module.exports = function (req, res, next){

我已经面对这个问题好几天了。我正在尝试从我的网站(mywebsite.com)调用我的API(API.mywebsite.com),在我尝试通过授权头之前,它工作正常。在这一点上,它不再是一个简单的请求,而是一个预飞行请求

但是,在最后,不会发送auth头,我得到的输入是:

这是我的前端代码(JS):

虽然这是API后端中的中间件:

//Allow the cors from every domain
 module.exports = function (req, res, next){
    res.setHeader('Access-Control-Allow-Origin', req.host);
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Authorization');

    if(req.method === 'OPTIONS'){
       return res.send(200);
    }

    next();
}
有人能帮我吗?

根据

特别是,如果以下任一条件为真,则请求将被预引导:

如果除了用户代理自动设置的头(例如,连接、用户代理或任何其他头,其名称在Fetch规范中定义为“禁止的头名称”)

禁止的标题包括:

它有
访问控制请求头
,我们可以看到它正在与您的请求一起发送。这解释了飞行前的使用

我认为这个过程看起来还可以-但是在您对飞行前的响应标题中,我注意到访问控制允许来源是
api.myapp.com
,而在请求中if位于端口
8888
。我认为,如果http的端口号不是80,那么在响应中应该有端口号。看见如果出现以下情况,则原点相同:

如果两个页面的协议、端口(如果指定了一个)和主机相同,则两个页面具有相同的来源。您有时会看到它被称为“scheme/host/port元组”(其中“元组”是一组由三个组件组成的整体)


因此,我认为问题可能在于,您的飞行前会告诉客户端,只允许使用api.myapp.com,但实际请求可能会发送到,因此来源不匹配。或者我误解了您的意图吗?

您必须删除api url的“8888”端口,api服务器必须已经为api.myapp.com地址设置了一个端口。

选项请求在设计上不包括身份验证头。@KevinB我不是要求它们传递身份验证头,但我想问的是,为什么在得到响应并且一切正常后,它不发出新的GET请求。因为。。。一切都不好。原点与允许的原点不匹配。错误消息至少应该告诉您这么多。我尝试手动添加端口和协议,但结果没有改变。仍然只获得选项请求@DavidGoateOk,这很有效!我添加了错误的端口(API的端口,而不是webapp的端口)。不是每件事都很好!非常感谢你,伙计!正常流程是,如果CORS检查通过,则在成功的选项请求后,浏览器将发出实际请求。您可以看到NetDeveloper工具控制台中是否存在解释原因的错误。我的直觉告诉我这只是一个来源不匹配。在您的示例中,我看到不止一个origin正在使用。很酷,很高兴您能使用它!
//Allow the cors from every domain
 module.exports = function (req, res, next){
    res.setHeader('Access-Control-Allow-Origin', req.host);
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'Authorization');

    if(req.method === 'OPTIONS'){
       return res.send(200);
    }

    next();
}