Node.js: POST - Метод запроса: ОПЦИИ Код состояния: 403 Запрещено

У нас есть следующая настройка:

Front end code : REACT (Hosted using express js) (lets call this www.domainA.com)
Backend        : .NET WEB API (Hosted in IIS 7.5) (lets call this www.domainB.com)

Домен приложения FE делает запрос на получение данных и данных POST в веб-API.

GET работает отлично, однако всякий раз, когда я пытаюсь отправить данные POST в веб-API, он выдает следующую ошибку:

Request URL: http://www.domainB.com/api/postdataoperation
Request Method: OPTIONS
Status Code: 403 Forbidden

Я просмотрел много статей о CORS и продолжил настройку HTTPResponseHeaders в IIS следующим образом:

Access-Control-Allow-Methods : POST,GET,OPTIONS,PUT,DELETE
Access-Control-Allow-Origin  : http://www.domainA.com

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

axios.post(`http://www.domainB.com/api/postdataoperation`, {userId});

Я правильно понимаю, вы размещаете сервер узла в IIS?

Maximilian Burszley 29.03.2018 20:18

@ TheIncorrigible1, извините за упущение деталей (обновлено), FE размещен на Express

Murtaza Mandvi 29.03.2018 21:24

Что вы видите в консоли браузера? Это даст вам сообщение об ошибке, сообщающее, в чем проблема с заголовками запроса / CORS. Пожалуйста, добавьте эту информацию к своему вопросу, так как она важна для решения.

Tarun Lalwani 20.04.2018 18:02

вы используете csrf_token?

MrMins 22.04.2018 22:13

Вы написали сервер Node.js? Если да, то можете ли вы поделиться с нами разделами маршрутов, которые принимают запросы GET или POST. Это прояснит, в чем проблема. Более того, вы можете посмотреть журналы сервера Node.js, чтобы найти точную ошибку.

Hannan 27.04.2018 12:05

@MuhammadHannan, он запускает сервер nodejs на domainA.com, но это не имеет значения. Библиотеку «axios» можно использовать либо для а) создания XMLHttpRequests из браузера, или для б) выполнения HTTP-запросов от node.js. В данном случае это первый вариант, «axios.post» в domainB осуществляется из браузера, поэтому он получает предварительный запрос.

Jannes Botis 27.04.2018 14:21

Вы проверили эти ссылки: github.com/axios/axios/issues/960github.com/axios/axios/issues/191stackoverflow.com/questions/44745673/…

Hannan 27.04.2018 17:07

Еще один совет, возможно, ваш сервер работает с TLS (с протоколом https), и вы запрашиваете только URL-адрес http.

Hannan 27.04.2018 17:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
8
6 478
3

Ответы 3

Проблема в том, что ваш сервер не настроен для ответа на запросы ПАРАМЕТРЫ с правильным статусом ответа, 2xx успешный статус.

GET работает, потому что он не выполняет предполетный запрос, поскольку он соответствует критериям простой запрос, как определено Документация CORS

С другой стороны, запрос POST соответствует критериям Предварительный запрос, что означает, что сначала должен быть сделан предварительный запрос OPTIONS.

Короче говоря, вы правильно настроили заголовки ответов CORS, но сервер не настроен для ответа с помощью Ответ 2xx на запросы метода OPTIONS (обычно статус 200).

The server must respond to OPTIONS requests with a 2xx success status—typically 200 or 204.

If the server doesn’t do that, it makes no difference what Access-Control-* headers you have it configured to send. And the answer to configuring the server to handle OPTIONS requests in the right way—to send a 200 or 204 success message—depends on what server software it’s running

Заимствуя решение от этот ответ, сделайте это на своем сервере, .NET WEB API:

В вашем BaseApiController.cs:

Мы делаем это, чтобы разрешить http-глагол OPTIONS

public class BaseApiController : ApiController
  {
    public HttpResponseMessage Options()
    {
      return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
    }
}

Рекомендации

Предварительные запросы

ответ на предполетный 403 запрещен

Примечание

Запуск сервера nodejs на domainA.com не имеет значения. Библиотеку "аксиос" можно использовать либо для a) создания XMLHttpRequests из браузера, либо для b) выполнения HTTP-запросов от node.js. В данном случае это первый вариант, "axios.post" в домен B осуществляется через XMLHttpRequest из браузера, поэтому вы получаете предварительный запрос на domainB.com.

каков результат работы веб-API .NET в случае сбоя запроса POST?

Это должен быть комментарий, а не ответ

Tarun Lalwani 25.04.2018 15:05

Ответ Яннеса Ботиса хорошо объясняет механизм Preflighted. Я просто добавляю код, который использую для решения этой проблемы, на Node.js / Express.

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', 'http://www.domainA.com');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
  res.setHeader(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  );
  next();
});

// All OPTIONS requests return a simple status: 'OK'
app.options('*', (req, res) => {
  res.json({
    status: 'OK'
  });
});

app.get('/', ...);

app.post('/api/postdataoperation', ...);

Другие вопросы по теме