Запрос ответа отправляется без заголовка авторизации - PullRequest
2 голосов
/ 21 февраля 2020

Я пытаюсь передать токен носителя на http-сервер fastify в моих заголовках.

Я устанавливаю заголовки внутри своего запроса как:

...
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 я смотрю заголовки, а 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'
      })
    }
  })
}

Когда я печатаю заголовки на сервере, он также не имеет 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 кодов ответа и закрепляет распечатки 200 в журнале. Однако при запуске из саги / запроса с:

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

я получаю response.status из 0 вместо 200 внутри метода запроса, в то время как журнал сервера по-прежнему показывает "res":{"statusCode":200}.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Я разобрался в чем проблема.

Очевидно, моя версия Chrome - Version 80.0.3987.106 (Official Build) (64-bit) и, возможно, другие браузеры и более старые версии Chrome, также удаляют заголовок authorization, когда он используется вместе с no-cors Режим. Включение CORS и установка соответствующих заголовков решает проблему.

0 голосов
/ 21 февраля 2020

Попробуйте добавить withCredentials: true и credentials: '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

...