Как включить CORS для учетных данных и предварительной проверки в Node / Express - PullRequest
0 голосов
/ 28 мая 2020

Я знаю, здесь есть миллиард вопросов CORS. Я прошел через десятки. Я все еще не уверен, в чем проблема, и я думаю, что достаточно хорошо понимаю CORS, но, очевидно, мне что-то здесь не хватает.

Я пытаюсь получить свой (Node / Express) API работает на реальном URL-адресе (т.е. развернут, не использует origin: "*"), и сообщает браузеру, что нужно выполнять запросы с моего GUI URL-адреса.

Для некоторых маршрутов мне нужна аутентификация, поэтому мне нужна добавить туда credentials.

Это довольно стандартный вариант использования, но, возможно, что-то изменилось в API с тех пор, как я делал это в последний раз, или, может быть, я просто забыл, но, несмотря на это, я не могу получить это работает, и я не уверен, что мне не хватает.

Кажется, есть несколько способов go включить CORS для всех запросов в моем приложении Express. В настоящее время я использую промежуточное ПО cors с его объектом параметров.

В частности, вот код, который я использую.

const app: express.Application = express();

const corsOptions = {
  credentials: true,
  origin: 'https://my-gui.example.com',
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
  preflightContinue: true,
}
app.use(cors(corsOptions));

Что я делаю не так? Когда я делаю запрос fetch из своего браузера, я получаю следующую ошибку:

Access to fetch at 'https://my-api.example.com/graphql' from origin 'https://my-gui.example.com'
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.

Если я добавляю app.options('*', cors(corsOptions)); перед вызовом app.use (зачем мне это нужно, когда я указал OPTIONS в списке method, я не знаю), я получаю другую ошибку (которая заставляет меня думать, что мне это по какой-то причине нужно).

Access to fetch at 'https://my-api.example.com/graphql' from origin 'https://my-gui.example.com'
has been blocked by CORS policy: Response to preflight request doesn't pass access control
check: It does not have HTTP ok status.

1 Ответ

0 голосов
/ 28 мая 2020

Я думаю, вы пытаетесь получить доступ к этому веб-сайту https://my-api.example.com/graphql, но общий фрагмент выглядит так, как будто вы предоставили доступ только к https://my-gui.example.com, а он отличается от приведенного выше.

Итак, мой ответ: пожалуйста, измените ваш фрагмент, как показано ниже,

const corsOptions = {
  credentials: true,
  origin: "*",
  methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
  preflightContinue: true,
}

(или) попробуйте

const corsOptions = {
      credentials: true,
      origin: ['https://my-gui.example.com','https://my-api.example.com/graphql'],
      methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS',
      preflightContinue: true,
    }
...