Обработчик предполетных запросов arc.коды

#node.js #cors #httprequest #preflight #architect

Вопрос:

Я сталкиваюсь со странной ошибкой с cors при выполнении запроса со страницы react на мой сервер, для запуска которой используется платформа arc.codes. Это полная ошибка:

 Access to fetch at 'http://localhost:3333/api/endpoint' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
 

Мой внешний код, который сделал запрос, выглядит следующим образом:

 const options = {
        method: 'GET',
        headers: {
            'Authorization':'Bearer token'
        },
    };
const response = yield call( fetchJSON, `${process.env.REACT_APP_BACKEND_URL}/contractormonths`, options );

 

Внутренний код, который обрабатывает запросы:

файл манифеста .arc:

 @app
my-app

@http
get /api/contractormonths
 

index.js файл в /get-api-месяцы подрядчика

 const arc = require('@architect/functions');
const { authorization } = require('@architect/shared/oauth');

async function route(request){
  return {
      cors: true,
      json: {'message':'Hello world!'}
  };
}

exports.handler = arc.http.async(authorization, route);

 

Функция авторизации также возвращает объект со свойством cors: true

То, что я уже пробовал и чему научился:

  • Я думаю, что запрос не попадает в функцию обработчика GET в задней части
  • Когда я удалил промежуточное программное обеспечение аутентификации (сзади) и заголовок аутентификации (спереди), это работает!
  • Вероятно, это связано с запросом перед полетом, сделанным браузером (когда это простой GET без заголовков, он не отправляет запрос перед полетом, но делает это при использовании заголовка auth).
  • Предполетный запрос отправляет запрос ПАРАМЕТРОВ на мой сервер, я могу подтвердить это, потому что добавление обработчика запроса ПАРАМЕТРОВ в мой сервер получает запросы вместо обработчика GET

Что я могу сделать, чтобы обработать эти предварительные запросы в моем бэкэнде? Нужно ли мне писать обработчик запроса ПАРАМЕТРОВ для всех моих текущих конечных точек? Есть ли способ отключить предполетный запрос? Можно ли отключить предполетный запрос? Не упускаю ли я еще одну важную вещь и не усложняю ли это?

Ответ №1:

Трудно сказать, не видя кода вашей authorization функции, но именно в этом и кроется корень проблемы. Вы упомянули в своем вопросе, что:

Функция авторизации также возвращает объект со свойством cors: true

но на самом деле вы не хотите возвращать объект из этой функции, если только вы не выполнили шаг аутентификации.

Пример метода авторизации может выглядеть следующим образом:

 module.exports = async function auth (req, res, next) {
  // Do the OAuth Dance
  const oauth = oauthDance()
  if (!oauth.authenticated) {
    return {
      status: 401,
        json: { errors: [ 'authorization_failed' ] }
    }
  } else {
    // Oauth succeeded so let's add the token to the request
    // for the next function in the chain
    req.token = oauth.token
    next()
  }
}
 

Это довольно надуманный псевдокод, но я подозреваю return , что ваш authorization метод приводит к короткому замыканию цепи, и именно поэтому предполетная проверка завершается неудачей. Использование next() для перехода к следующей функции в цепочке должно решить вашу проблему.