【问题标题】:The "Authorization" header is not sent in OPTIONS call by the browser浏览器未在 OPTIONS 调用中发送“授权”标头
【发布时间】:2019-02-03 22:06:53
【问题描述】:

我有一个非常简单的 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 Unauthorized。

浏览器的 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 标头?

【问题讨论】:

    标签: javascript cors


    【解决方案1】:

    浏览器在 OPTIONS 请求中不发送 Authorization 标头是否很常见

    比常见的更多。 the CORS spec 要求它表示“对于带有预检的跨域请求......发出预检请求......排除用户凭据”。

    我需要更改服务器以响应 OPTIONS 调用而不需要 Authorization 标头?

    是的

    【讨论】:

      【解决方案2】:

      客户端请求Options 调用,在您的情况下,Chrome 浏览器在实际的GET 调用之前隐式请求。

      来自MDN

      HTTP OPTIONS 方法用于描述通信选项 为目标资源。客户端可以为 OPTIONS 指定一个 URL 方法或星号 (*) 表示整个服务器。

      在服务器端,您必须拦截此 Options 请求并返回 HTTP 状态代码 200 和 Allow 标头,指示允许对该资源进行的操作。例如:Allow: HEAD,GET,PUT,DELETE,OPTIONS

      收到这些详细信息的浏览器将继续调用Get

      【讨论】:

      • 虽然这些是关于 OPTIONS 请求的一堆事实,但您还没有回答问题。
      • 不,不是。这是一个关于预检响应需要包含什么的轻量级解释。它没有提及问题所询问的缺少授权标头。
      猜你喜欢
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 2016-06-19
      • 2018-12-30
      • 2012-08-17
      • 2019-08-26
      相关资源
      最近更新 更多