Ошибка CORS при запросах POST, PUT и DELETE, но GET работает нормально - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я создаю приложение, используя стек MERN, и у меня возникают проблемы с доступом к моему REST API. Он может получать данные, используя запрос get, но запись данных, похоже, не удалась.

У меня есть этот блок кода перед объявлением моих маршрутов:

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'https://staging.domain.io');
    res.header('Access-Control-Allow-Methods', 'GET, OPTIONS, PUT, POST, DELETE');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    res.header('Access-Control-Allow-Credentials', true);
    next();
});

Я использую ax ios в интерфейс для выполнения этих вызовов API и установки атрибута withCredentials в значение true

Некоторые замечания, которые могут пригодиться:

Я делюсь своими cookie-файлами в своих доменах и поддоменах, используя cook ie -session (объявлено ПЕРЕД настройкой CORS (приведенный выше код)

app.use(
  session({
    maxAge: 24 * 60 * 60 * 1000,
    keys: [process.env.SESSION_ENCRYPTION],
    domain: 'domain.io',
    signed: true,
    httpOnly: false,
    secure: false
  }));

Это не удалось только при развертывании в GCP, оно работало нормально на localhost.

Что я до сих пор пробовал:

Использовал пакет промежуточного программного обеспечения express cors и настроил его следующим образом:

app.use(
  cors({
    origin: 'https://staging.domain.io/',
    credentials: true
  })
);
app.options(
  "*",
  cors({
    origin: 'https://staging.domain.io/',
    credentials: true
  })
);

Похоже, что этот код не меняет поведение вообще, так как не было ничего другого, независимо от того, если этот код помещен. Однако, если я сохраню этот код и удаляю код в самом верху, весь API завершается ошибкой (даже запросы GET).

Так что теперь я как бы застрял в том, как go об этой проблеме. у предложений?

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

После нескольких дней и множества царапин на голове я выяснил, где я ошибся. Для подхода пакета cors атрибут origin не равен origin заголовка запроса

Заголовок запроса:

  • Origin: staging.domain.io

и атрибут источника cors

  • origin: staging.domain.io/

Все, что мне нужно было сделать, это удалить sla sh из источника в cors, ха-ха.

Первый подход (без использования cors) все еще остается проблемой.

...