Итак, CORS на самом деле очень неприятен в этом отношении, но есть довольно простой способ это исправить. Это очень полезная функция безопасности, хотя иногда она в лучшем случае разочаровывает.
Ваш браузер выполняет так называемый предварительный запрос, который имеет http-глагол OPTIONS
. Ваш браузер вызывает любой маршрут, который вы хотите, но вместо того, что вы просили сделать, сначала он вызывает OPTIONS
. Ваш сервер должен принимать все маршруты, которые клиент может запрашивать с помощью метода OPTIONS
, а ваш сервер должен отвечать следующими заголовками, чтобы получить доступный извне, кросс-исходный API.
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, ...
(обратите внимание, вы не должны помещать ... в, но вы можете поместить любой HTTP-глагол в этот список)
Если вам требуются ваши собственные заголовки (для целей аутентификации), вы хотите добавить этот заголовок для Client -> Server.
Access-Control-Allow-Headers: YourHeader, YourHeader2, YourHeader3
Вы хотите добавить это для Сервера -> Клиент
Access-Control-Expose-Headers: YourHeader,YourHeader3
Обратите внимание, что вызов OPTIONS
- это совершенно отдельный вызов, который вы должны обрабатывать так же, как и метод GET
.
Вы сказали браузеру, что ему разрешено запрашивать, и что он может ожидать от вашего API. Если вы не ответите на запрос OPTIONS
, браузер завершит запрос, что приведет к ошибке CORS.
Я собираюсь сделать предположение и предположить, что вы, вероятно, используете Express, который в этом ответе описывает, как установить заголовки.
Что означают заголовки на английском языке?
Access-Control-Allow-Origin
Откуда клиентам разрешен доступ к этому ресурсу (конечной точке)? Это может соответствовать частичным доменам с подстановочными знаками, или просто *
, чтобы разрешить где угодно.
Access-Control-Allow-Methods
Какие методы HTTP допустимы на этом маршруте?
Access-Control-Expose-Headers
Когда я получаю ответ от сервера, что я (браузер) должен предоставить клиенту?
Access-Control-Allow-Headers
Что мне, как клиентской стороне, разрешено отправлять в качестве заголовков?