Облачная платформаAdvanced

CORS вызов открытого API

Эта статья полезна?
Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

По соображениям безопасности браузеры ограничивают кросс‑доменные запросы, инициируемые из скриптов. Это означает, что веб‑приложение может запрашивать ресурсы только со своего источника. Механизм CORS позволяет браузерам отправлять XMLHttpRequest на серверы в других доменах и запрашивать доступ к их ресурсам.

Рисунок 1 Поток процесса механизма CORS


Существует два типа запросов CORS:

  • Простые запросы

    Простые запросы должны соответствовать следующим условиям:

    1. Метод запроса — HEAD, GET или POST.
    2. Заголовок запроса содержит только следующие поля:
      • Accept
      • Accept-Language
      • Content-Language
      • Last-Event-ID
      • Content-Type (application/x-www-form-urlencoded, multipart/form-data, or text/plain)

    В заголовке простого запроса браузеры автоматически добавляют Origin поле, указывающее источник (включая протокол, домен и порт) запроса. После получения такого запроса целевой сервер определяет, безопасен ли запрос и может ли он быть принят на основании источника. Если сервер отправляет ответ, содержащий Access-Control-Allow-Origin поле, сервер принимает запрос.

  • Непростые запросы

    Запросы, не соответствующие условиям простых запросов, являются непростыми запросами.

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

Настройка CORS

CORS отключён по умолчанию. Чтобы включить CORS для API, выполните операции, описанные в этом разделе. Чтобы настроить заголовки запросов, методы запросов и разрешённые источники для доступа с разных доменов, создайте политику плагина CORS, ссылаясь на CORS.

  • Простые запросы CORS

    При создании API включите CORS в Конфигурация безопасности разделе Создать API странице. Для получения дополнительной информации см. Простой запрос.

  • Не совсем простые запросы CORS

    Не совсем простые запросы CORS могут быть реализованы одним из следующих способов:

    • Метод 1: Создать API, который использует OPTIONS метод для предзапроса. Следуйте этой процедуре, чтобы определить API запроса предзапроса. Для подробностей смотрите Not-So-Simple Request.
    • Метод 2: Настройте политику CORS и привяжите её к API. Для подробностей смотрите CORS.
    1. В Frontend Definition области, задайте следующие параметры:
      1. Метод: Выберите OPTIONS.
      2. Протокол: Тот же протокол, который используется API с включённым CORS.
      3. Путь: Введите слеш (/).

      Figure 2 Defining the API request


    2. В Security Configuration area, select None and enable CORS.
    3. Select the Mock backend type.

Simple Request

When creating an API that will receive simple requests, enable CORS for the API.

Scenario 1: If CORS is enabled and the response from the backend does not contain a CORS header, APIG handles requests from any domain, and returns the Access-Control-Allow-Origin header. For example:

Request sent by a browser and containing the Origin header field:

GET /simple HTTP/1.1
Host: www.test.com
Origin: http://www.cors.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Accept: application/json
Date: Tue, 15 Jan 2019 01:25:52 GMT

Origin: Это поле обязательно для указания источника (http://www.cors.com в этом примере) запроса. APIG и служба бэкэнда определяют на основе origin, безопасен ли запрос и может ли он быть принят.

Ответ, отправленный службой бэкэнда:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
{"status":"200"}

Ответ, отправленный APIG:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
X-Request-Id: 454d689fa69847610b3ca486458fb08b
Access-Control-Allow-Origin: *
{"status":"200"}

Access-Control-Allow-Origin: Это поле обязательно. Звёздочка (*) означает, что APIG обрабатывает запросы, отправленные с любого домена.

Сценарий 2: Если CORS включён и ответ от бэкэнда содержит заголовок CORS, заголовок перезапишет добавленный APIG. Следующие сообщения использованы в качестве примеров:

Запрос, отправленный браузером и содержащий поле заголовка Origin:

GET /simple HTTP/1.1
Host: www.test.com
Origin: http://www.cors.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Accept: application/json
Date: Tue, 15 Jan 2019 01:25:52 GMT

Origin: Это поле обязательно для указания источника (http://www.cors.com в этом примере) запроса. APIG и backend service определяют на основе источника, безопасен ли запрос и может быть принят.

Ответ, отправленный backend service:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
Access-Control-Allow-Origin: http://www.cors.com
{"status":"200"}

Access-Control-Allow-Origin: указывает, что backend service принимает запросы, отправленные от http://www.cors.com.

Ответ, отправленный APIG:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
X-Request-Id: 454d689fa69847610b3ca486458fb08b
Access-Control-Allow-Origin: http://www.cors.com
{"status":"200"}

Заголовок CORS в ответе backend перезаписывает его в ответе APIG.

Not-So-Simple Request

При создании API, который будет получать непростые запросы, включите CORS для API, следуя инструкциям в Configuring CORS, а затем создайте другой API, который будет доступен с использованием метода OPTIONS.

Параметры запроса API, доступного с использованием метода OPTIONS, должны быть заданы следующим образом:

  • Группа: Тот же набор, к которому относится API с включённым CORS.
  • Метод: Выберите OPTIONS.
  • Протокол: Тот же протокол используется API с включённым CORS.
  • Путь: Введите слеш (/) или выберите путь, который был установлен для API или соответствует API с включённым CORS.
  • Аутентификация безопасности: Выберите Нет. Не требуется аутентификация для запросов, получаемых новым API, независимо от выбранного режима аутентификации безопасности.
  • CORS: Включите эту опцию.

Ниже приведены примерные запросы и ответы, отправленные к имитационному бэкенду или от него.

Запрос, отправленный из браузера к API, к которому обращаются с использованием метода OPTIONS:

OPTIONS /HTTP/1.1
User-Agent: curl/7.29.0
Host: localhost
Accept: */*
Origin: http://www.cors.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Sdk-Date
  • Источник: Это поле обязательно для указания источника, откуда был отправлен запрос.
  • Access-Control-Request-Method: Это поле обязательно для указания HTTP‑методов, которые будут использоваться последующими простыми запросами.
  • Access-Control-Request-Headers: Это поле необязательно и используется для указания дополнительных полей заголовков в последующих простых запросах.

Ответ, отправленный бэкендом: нет

Ответ, отправленный APIG:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 02:38:48 GMT
Content-Type: application/json
Content-Length: 1036
Server: api-gateway
X-Request-Id: c9b8926888c356d6a9581c5c10bb4d11
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Stage,X-Sdk-Date,X-Sdk-Nonce,X-Proxy-Signed-Headers,X-Sdk-Content-Sha256,X-Forwarded-For,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range
Access-Control-Expose-Headers: X-Request-Id,X-Apig-Latency,X-Apig-Upstream-Latency,X-Apig-RateLimit-Api,X-Apig-RateLimit-User,X-Apig-RateLimit-App,X-Apig-RateLimit-Ip,X-Apig-RateLimit-Api-Allenv
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCH
Access-Control-Max-Age: 172800
  • Access-Control-Allow-Origin: Это поле обязательно. Звёздочка (*) означает, что APIG обрабатывает запросы, отправленные с любого домена.
  • Access-Control-Allow-Headers: Это поле обязательно, если оно содержится в запросе. Оно указывает все поля заголовков, которые могут использоваться при кросс‑доменном доступе.
  • Access-Control-Expose-Headers: Это поля заголовков ответа, которые могут быть просмотрены при кросс‑региональном доступе.
  • Access-Control-Allow-Methods: Это поле необходимо для указания, какие HTTP‑запросы поддерживает APIG.
  • Access-Control-Max-Age: Это поле необязательно и используется для указания продолжительности (в секундах), в течение которой результат предварительного запроса остаётся действительным. В течение указанного периода дополнительные предварительные запросы отправляться не будут.

Запрос, отправленный браузером и содержащий заголовок Origin:

PUT /simple HTTP/1.1
Host: www.test.com
Origin: http://www.cors.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Accept: application/json
Date: Tue, 15 Jan 2019 01:25:52 GMT

Ответ, отправленный бэкендом:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
{"status":"200"}

Ответ, отправленный APIG:

HTTP/1.1 200 OK
Date: Tue, 15 Jan 2019 01:25:52 GMT
Content-Type: application/json
Content-Length: 16
Server: api-gateway
X-Request-Id: 454d689fa69847610b3ca486458fb08b
Access-Control-Allow-Origin: *
{"status":"200"}