未经授权发送 React 请求 header

React request is being sent without an Authorization header

我正在尝试在我的 headers.

中将不记名令牌传递给 fastify http 服务器

我将请求中的 headers 设置为:

...
const headers = {
  Accept: 'application/json',
  'Content-Type': 'application/json'
}
const token = localStorage.getItem('token')
if (token) {
  headers['Authorization'] = `Bearer ${token}`
}
const newOptions = {
  ...options,
  mode: 'no-cors',
  headers
}
console.log('options:', newOptions)
return fetch(url, newOptions)

我的 console.log 打印:

options: {
  mode: "no-cors", 
  headers: {
    Accept: "application/json",
    Content-Type: "application/json",
    Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
  }
}

在 Chrome 网络选项卡中,我查看了 headers,Authorization 在那里不存在。我的路由处理函数如下:

async function user(server, options) {
  server.route({
    method: 'GET',
    url: '/user/:email',
    handler: async (req, res) => {
      const username = req.params.email
      console.log('user email:', username)
      console.log('headers:', req.headers)
      res.send({
        type: 'promoter'
      })
    }
  })
}

当我在服务器上打印headers时,它也没有Authorization,显示:

headers: { host: 'localhost:5000',
  connection: 'keep-alive',
  pragma: 'no-cache',
  'cache-control': 'no-cache',
  accept: 'application/json',
  'sec-fetch-dest': 'empty',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36',
  'sec-fetch-site': 'same-site',
  'sec-fetch-mode': 'no-cors',
  referer: 'http://localhost:3000/admin',
  'accept-encoding': 'gzip, deflate, br',
  'accept-language': 'en-US,en;q=0.9,ru;q=0.8' }

我错过了什么?

另一个有趣的问题是,当我 运行 来自 Postman 的请求时,它显示 200 响应代码,并且 fastify 将 200 打印到日志中。但是,运行ning 来自 saga/request 与:

  return fetch(url, newOptions)
    .then(checkStatus)
    .then(parseJSON)

我在请求方法中得到 response.status of 0 而不是 200,而服务器日志仍然显示 "res":{"statusCode":200}.

尝试将 withCredentials: truecredentials: 'include' 添加到您的选项中:

options: {
  mode: "no-cors",
  withCredentials: true, // <-- ADD THIS
  credentials: 'include', // <-- AND THIS
  headers: {
    Accept: "application/json",
    Content-Type: "application/json",
    Authorization: "Bearer NQ9xQLmYtq92aT8JHHRd7DGZJ..."
  }
}

参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

我知道问题出在哪里了。

显然,我的 Chrome - Version 80.0.3987.106 (Official Build) (64-bit) 版本以及可能的其他浏览器和旧版本的 Chrome,也去掉了 authorization header , 当它与 no-cors 模式结合使用时。启用 CORS 并设置适当的 header 可以解决问题。