取 - 回应预检响应
我与取过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请求?
我在这里错过了一些非常基本的东西。
如果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请求。
附带说明:似乎没有必要为'GET'请求发送'Content-Type'请求标头...'GET'中没有内容给予内容类型... – sideshowbarker
我在猜测OPTIONS可能由于服务器要求对该OPTIONS请求进行认证而失败。请参阅我刚才讨论的答案 – sideshowbarker