我有一个非常简单的HTTP调用:
fetch('http://127.0.0.1:5500/v1/homes/', {
method: "GET",
mode: "cors",
credentials: "same-origin",
headers: {
Authorization: "TEST"
}})
.then(function(response) {
console.log(response);
});
但是,当我查看Google Chrome DevTools的“网络”标签时,OPTIONS请求中没有“授权”标头。这将导致服务器回复“ 401未经授权”。
浏览器的curl等同于请求:
curl 'http://127.0.0.1:5500/v1/homes/' \
-X OPTIONS -H 'Access-Control-Request-Method: GET' \
-H 'Origin: http://localhost:8100'
-H 'Referer: http://localhost:8100/'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
-H 'Access-Control-Request-Headers: authorization'
--compressed
我在客户端做错什么了吗?或者浏览器不发送OPTIONS请求中的Authorization标头是很常见的事,因此,我需要更改服务器的方式来响应OPTIONS调用,而无需Authorization标头?
答案 0 :(得分:2)
浏览器不发送OPTIONS请求中的Authorization标头是很常见的情况
不仅仅如此。 the CORS spec要求它说“ 对于具有预检的跨域请求…进行预检请求…排除用户凭据”。
我需要更改服务器以响应OPTIONS调用而不需要Authorization标头吗?
是
答案 1 :(得分:1)
客户端请求Options
调用,在您的情况下,Chrome浏览器在实际的GET
调用之前隐式请求。
来自MDN
HTTP OPTIONS方法用于描述通信选项 目标资源。客户端可以为选项指定URL 方法或星号(*)表示整个服务器。
在服务器端,您将不得不截获此Options请求,并以HTTP状态代码200和Allow
标头进行响应,以指示对此资源允许的操作。例如:Allow: HEAD,GET,PUT,DELETE,OPTIONS
浏览器收到这些详细信息后,将继续进行Get
调用。