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

Перед написанием прокси Cors важно понять, как работает cors. Итак, приступим.

CORS

Когда вы запускаете веб-сервер, вы не можете получить доступ к изображениям, API-интерфейсам и т. Д. С разных серверов, если CORS не включен сервером (политика одинакового происхождения). Например, вы используете веб-сервер A и хотите получить доступ к ImageB с сервера B, вы не можете получить доступ к ImageB, если CORS не включен сервером A.

Так что же такое CORS?

Совместное использование ресурсов между источниками (CORS) - это механизм безопасности, который использует дополнительные заголовки HTTP, чтобы указать браузерам предоставить веб-приложению, работающему в одном источнике, доступ к выбранным ресурсам из другого источника. Веб-приложение выполняет HTTP-запрос с несколькими источниками, когда оно запрашивает ресурс (изображения, сценарии, файлы CSS и т. Д.), Который имеет другое происхождение (домен, протокол или порт), отличное от его собственного.

Однако запросы из разных источников означают, что серверы должны реализовывать способы обработки запросов из источников за пределами их собственных. CORS позволяет серверам указывать, кто (т. Е. Какие источники) может получать доступ к активам на сервере, среди прочего.

Как работает CORS?

Запросы между источниками управляются путем добавления новых заголовков HTTP в стандартный список заголовков. Следующие HTTP-заголовки добавлены стандартом CORS:

  • Access-Control-Allow-Origin
  • Access-Control-Allow-Credentials
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Methods
  • Access-Control-Expose-Headers
  • Access-Control-Max-Age
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Origin

Заголовок Access-Control-Allow-Origin

Когда сайт A пытается получить контент с сайта B, сайт B может отправить заголовок ответа Access-Control-Allow-Origin, чтобы сообщить браузеру, что контент этой страницы доступен для определенных источников. (origin - это домен, плюс схема и номер порта.) По умолчанию страницы сайта B недоступны для любого другого источника; использование заголовка Access-Control-Allow-Origin открывает дверь для доступа между разными источниками для определенных запрашивающих источников. Заголовок Access-Control-Allow-Origin критически важен для безопасности ресурсов.

Вы можете найти описание каждого заголовка CORS в следующей строке: Заголовки CORS.

Предполетный запрос

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

Когда запрос выполняется с использованием любого из следующих методов HTTP-запроса, стандартный запрос предварительной проверки будет выполнен перед исходным запросом.

  • PUT
  • DELETE
  • CONNECT
  • OPTIONS
  • TRACE
  • PATCH

Запросы предварительной проверки используют заголовок OPTIONS. Предварительный запрос отправляется перед исходным запросом, отсюда и термин «предварительная проверка». Цель предварительного запроса - определить, безопасен ли исходный запрос (например, запрос DELETE). Сервер ответит на предварительный запрос и укажет, безопасен ли исходный запрос. Если сервер указывает, что исходный запрос безопасен, он разрешит исходный запрос. В противном случае он заблокирует исходный запрос.

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

Я надеюсь, что вы уже хорошо понимаете CORS. Теперь давайте приступим к созданию базового прокси-сервера CORS.

Прокси-сервер CORS

Прокси-сервер CORS состоит из двух основных функций (этапов).

  1. Ответ на предварительный запрос: как мы обсуждали, браузер отправляет предварительный запрос, чтобы проверить, разрешены ли cors для данного метода для данного междоменного домена. Прокси-сервер Cors будет реализовывать CORS и будет отвечать на предварительный запрос Cors, задав заголовки CORS. Дальнейший последующий вызов передается на целевой сервер через CORS-сервер (CORS-прокси).
  2. Перенаправьте запрос CORS на целевой сервер, получите ответ от целевого сервера и отправьте ответ обратно клиенту.

Базовый прокси-сервер CORS в Nodejs:

использование

При вызове API с использованием JavaScript (с использованием XMLHTTPRequest, $ .ajax и т. Д.):

  1. Замените фактический URL-адрес службы на URL-адрес прокси.
  2. Установите метод запроса, параметры запроса и тело как обычно.
  3. Установите фактический URL-адрес службы (Target origin) в заголовке с именем «Target-URL».
  4. Отправьте заявку как обычно.

Заголовки CORS

Прокси-сервер разрешает все источники, методы и заголовки. Вероятно, вы захотите заблокировать это в производственной среде.

Другие заголовки

Прокси-сервер в настоящее время передает заголовок «Авторизация» целевой конечной точке. Вы можете изменить прокси для передачи дополнительных заголовков (или всех).

В конце концов

Основная цель этой публикации - дать обзор CORS и написать базовый прокси-сервер cors. Вышеупомянутая реализация поддерживает только данные JSON и может быть расширена для поддержки других функций. Надеюсь, вам понравилось и вы узнали что-то, прочитав этот пост. Спасибо за прочтение!. Пожалуйста, оставьте свои комментарии.