从响应中读取授权标头

cve*_*nov 4 authorization http request fetch superagent

我正在做一个副项目,我想在其中重用现有的 API。API 有一个/auth端点,用于处理 POST 请求emailpassword在请求正文中期望和。如果emailpassword得到验证,则服务器返回一个响应,其中包含一个Authorization标头,该标头包含应在所有后续请求中发送的令牌的值。

我在从响应中检索此标头时遇到问题。它在 Postman 和 Chrome Dev Tools(网络部分)中都可见。 邮差 Chrome 开发工具: XMLHttpRequest console.log 响应头的 在此处输入图片说明

我已经尝试了多个库/实现来发送请求(superagentrequestfetch实现甚至XMLHttpRequest),但是,Authorization当我在 Chrome 开发工具中查看它们时,我得到的所有响应都在响应头中包含标头,但是当我尝试访问时来自javascript的标题,我总是最终Content-Type只得到标题。

我在其他几个答案中读到服务器必须在标头中指定Access-Control-Expose-HeadersorAccess-Control-Allow-HeadersAuthorization值,但是,我无权访问服务器,并且 API 上没有与此问题相关的问题,所以我的猜测是发送请求时我遗漏了一些东西。

有任何想法吗?

这是使用的请求 fetch

return fetch(endpoint, {
    method: 'post',
    body: data,
    headers: {
      [API_KEY_HEADER]: apiKey
    }
  }).then(r => {
    console.log(r);
    console.log(r.headers)
  });
Run Code Online (Sandbox Code Playgroud)

这是使用的请求 request

r({
    url: endpoint,
    method: 'post',
    headers: {
      [API_KEY_HEADER]: apiKey
    }
  }).then(r => {
    console.log(r);
    console.log(r.headers);
  })
Run Code Online (Sandbox Code Playgroud)

这里很旧 XMLHttpRequest

  const request = new XMLHttpRequest();

  request.open('POST', endpoint);

  request.setRequestHeader('Content-Type', 'application/json');
  request.setRequestHeader(API_KEY_HEADER, apiKey);

  request.onreadystatechange = function () {
    if (this.readyState === 4) {
      console.log('Status:', this.status);
      console.log('Headers:', this.getAllResponseHeaders());
      console.log('Body:', this.responseText);
    }
  };

  const body = {
    'email': 'dummy@test.com',
    'password': 'secret!'
  };

  request.send(JSON.stringify(body));
Run Code Online (Sandbox Code Playgroud)

小智 5

2 年太晚了,但希望这可以帮助遇到同样问题的人:

正如@shaochuancs 所说,响应中的 Authorization 标头不是标准的,因此服务器必须明确通知以公开它。为此,服务器必须添加以下标头:

Access-Control-Expose-Headers:授权

来源:https : //www.yukei.net/2016/01/getting-response-headers-data-from-an-ajax-request-with-jquery/