取 - 回应预检响应

问题描述:

我与取过CORS举步维艰,授权:取 - 回应预检响应

const token = 'this.is.secret!'; 
fetch('http://corsserver/api/hello', { 
    method: 'get', 
    credentials: 'include', 
    mode: 'cors', 
    headers: { 
     'Authorization': `Bearer ${token}`, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}).then(response => { 
    console.log(response); 
}).catch(error => { 
    console.log(error); 
}); 

当我运行这个请求,Chrome会将标题为:

Request Method:OPTIONS

我看这个和it's a preflighted request

我的意思是,这是非常酷的东西。但是,我无法弄清如何在预检恢复正常后发送实际请求!下一步是什么?我如何发送GET请求?

我在这里错过了一些非常基本的东西。

+0

附带说明:似乎没有必要为'GET'请求发送'Content-Type'请求标头...'GET'中没有内容给予内容类型... – sideshowbarker

+0

我在猜测OPTIONS可能由于服务器要求对该OPTIONS请求进行认证而失败。请参阅我刚才讨论的答案 – sideshowbarker

如果OPTIONS请求成功,您的浏览器将自动发送实际的GET请求。但是,如果OPTIONS请求不成功,浏览器将永远不会发出GET请求。

而且没有其他方式使GET请求与浏览器做OPTIONS

因此,如果浏览器没有执行GET请求,它只能意味着OPTIONS必须失败,并且您需要找出原因。浏览器应该将原因记录到devtools控制台,所以你应该从检查那里开始(然后编辑/更新问题来添加该信息,或者发布一个新的单独的更具体的问题和错误消息) 。什么问题可能是


一个猜测:也许服务器需要为OPTIONS要求认证。如果是这样,您需要修复它,以便服务器不会 - 因为当浏览器发出OPTIONS请求时,它不会从您的代码发送Authorization标头+值。

而是实际上在这种情况下,OPTIONS请求的全部目的是浏览器的要求,你确定与获得跨域请求,其中包括了Authorization请求头?,并且服务器以指示其是否允许Authorization标头的方式进行响应。

因此,服务器必须配置为响应任何OPTIONS请求(来自允许的来源至少)与2xx成功响应,而不需要验证。

您知道服务器是否要求对该OPTIONS请求进行身份验证的方式是,如果浏览器正在记录的CORS错误消息显示OPTIONS响应的401状态。


为使Node.js服务器环境中处理OPTIONS示例代码:

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

...使服务器发送无响应的身体,这是你想要的这个200响应。请注意,这明确允许所有的OPTION请求。