INTEGRITY Документация

Настройка CORS

Cross-Origin Resource Sharing (CORS) является стандартизированным методом, который запрещает домену X доступ к ресурсам домена Y. Для этого используются специальные заголовки в HTTP-ответах домена Y, благодаря которым браузер может убедиться, что домен Y разрешает домену X доступ к этим ресурсам.

CORS помогает защитить ваши данные от вредоносных сайтов, но при этом также используется для взаимодействия с объектами в бакете и настройки политик бакета.

CORS используется при взаимодействии с бакетом из веб-браузера. У вас есть два варианта:

Откройте бакет для публичного доступа: Этот вариант делает ваш бакет доступным в интернете в режиме только для чтения, то есть любой человек может запрашивать и загружать объекты из вашего бакета в браузере или где угодно ещё. Этот вариант отлично подходит, если ваш бакет содержит изображения, используемые в публичном блоге.

Presigned URL: Позволяет любому, у кого есть доступ к уникальному URL, выполнять определённые действия с вашим бакетом.

Предварительные требования

Прежде чем настраивать CORS, у вас должно быть:

Использование CORS с публичным бакетом

Чтобы использовать CORS с публичным бакетом, убедитесь, что бакет настроен на разрешение публичного доступа.

Затем, добавить CORS-политику к вашему бакету, чтобы разрешить общий доступ к файлу.

Использование CORS с presigned URL

Presigned URLs предоставляют временный доступ для выполнения определённых действий с вашим бакетом без раскрытия ваших учётных данных. Presigned URL берут на себя аутентификацию, но вам всё равно нужно настроить CORS при отправке запросов из браузера.

Когда браузер отправляет запрос к presigned URL с другого источника, он применяет политику CORS. Без настроенной политики CORS загрузка и скачивание файлов через браузер с использованием presigned URL завершатся ошибкой, даже если сам presigned URL действителен.

Истекшие подписанные URL-адреса возвращают 403 ExpiredRequest ответ. R2 не включает заголовки ответа CORS в ответы с истекшими предварительно подписанными URL-адресами, поэтому JavaScript браузера не может прочитать тело ошибки. Обновляйте предварительно подписанные URL-адреса до их истечения или направляйте запросы через сервер вашего приложения, если браузеру нужно обрабатывать ошибки истечения срока действия напрямую.

Чтобы включить доступ из браузера с помощью presigned URL:

  1. Добавление CORS-политики к вашему бакету, разрешающее запросы с источника вашего приложения.

  2. Задайте AllowedMethods чтобы соответствовать операциям, которые выполняют ваши presigned URL, используйте GET, PUT, HEAD, и/или DELETE.

  3. Задайте AllowedHeaders чтобы включить любые заголовки, которые клиент будет отправлять при использовании presigned URL, например заголовки для типа содержимого, контрольных сумм, кеширования или пользовательских метаданных.

  4. (Необязательно) Задайте ExposeHeaders чтобы разрешить вашему JavaScript читать заголовки ответа, такие как ETag, который содержит хеш объекта и полезен для проверки загрузок.

  5. (Необязательно) Задайте MaxAgeSeconds чтобы кешировать ответ на preflight запрос и уменьшить число preflight запросов, которые делает браузер.

Следующий пример разрешает загрузку из браузера с https://example.com с Content-Type заголовок:

[
  {
    "AllowedOrigins": ["https://example.com"],
    "AllowedMethods": ["PUT"],
    "AllowedHeaders": ["Content-Type"],
    "ExposeHeaders": ["ETag"],
    "MaxAgeSeconds": 3600
  }
]

Использование CORS с пользовательским доменом

Пользовательские домены подключённые к бакету R2 с настроенной политикой CORS, автоматически возвращают заголовки ответа CORS для кросс-доменные запросы.

Межсайтовые запросы должны содержать корректный Origin заголовок запроса, например, Origin: https://example.com. Если вы тестируете напрямую или используете инструмент командной строки, например curl, вы не увидите CORS Access-Control-* заголовки ответа, если Origin заголовок запроса включен в запрос.

Добавление CORS-политик через панель управления

  1. На панели управления Cloudflare перейдите к разделу Объектное хранилище R2 страницу.

    Перейдите в Обзор ↗
  2. Найдите свой бакет в списке и выберите его.

  3. Выберите Настройки.

  4. В разделе Политика CORS, выберите Добавление CORS-политики.

  5. Из раздела JSON вкладке вручную введите или скопируйте и вставьте свою политику в текстовое поле.

  6. Когда закончите, выберите Save.

Ваша политика отображается на Настройки страница для вашего бакета.

Добавление CORS-политик через Wrangler CLI

Вы можете настроить правила CORS с помощью Wrangler CLI.

  1. Создайте JSON-файл с конфигурацией CORS:
cors.json
{
  "rules": [
    {
      "allowed": {
        "origins": ["https://example.com"],
        "methods": ["GET"]
      }
    }
  ]
}
  1. Примените CORS-политику к своему бакету:
npx wrangler r2 bucket cors set <BUCKET_NAME> --file cors.json
  1. Убедитесь, что политика CORS применена:
npx wrangler r2 bucket cors list <BUCKET_NAME>

Заголовки ответа

Перечисленные ниже поля политики CORS R2 соответствуют заголовкам ответа HTTP. Эти заголовки ответа возвращаются только в том случае, если входящий HTTP-запрос является допустимым CORS-запросом.

Имя поля Описание Пример
AllowedOrigins Указывает значение для Access-Control-Allow-Origin заголовок, который R2 устанавливает при запросе объектов в бакете из браузера. Если сайт по адресу www.test.com требуется доступ к ресурсам (например, шрифтам, скриптам) на пользовательский домен static.example.com, вы бы задали https://www.test.com как AllowedOrigin.
AllowedMethods Указывает значение для Access-Control-Allow-Methods заголовок, который R2 устанавливает при запросе объектов в бакете из браузера. GET, POST, PUT
AllowedHeaders Указывает значение для Access-Control-Allow-Headers заголовок, который R2 устанавливает при запросе объектов в этом бакете из браузера. Кросс-доменные запросы, включающие пользовательские заголовки (например, x-user-id) должен указывать эти заголовки как AllowedHeaders. x-requested-by, User-Agent
ExposeHeaders Указывает заголовки, которые могут быть переданы обратно и доступны для JavaScript, выполняющего межсайтовый запрос. Если вам нужен доступ к заголовкам помимо разрешённые заголовки ответа, например Content-Encoding или cf-cache-status, вы должны указать это здесь. Content-Encoding, cf-cache-status, Date
MaxAgeSeconds Указывает время (в секундах), в течение которого браузеры могут кешировать ответы на предварительные запросы CORS. Браузеры могут ограничивать это время двумя часами или менее, даже если указано максимальное значение (86400). 3600

Пример

В этом примере показана политика CORS, добавленная для бакета, который содержит Roboto-Light.ttf объект, представляющий собой файл шрифта.

AllowedOrigins указывает используемый веб-сервер, и localhost:3000 это имя хоста, на котором запущен веб-сервер. AllowedMethods указывает, что только GET запросы разрешены и могут читать объекты в вашем бакете.

[
	{
		"AllowedOrigins": ["http://localhost:3000"],
		"AllowedMethods": ["GET"]
	}
]

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

Также учтите, что распространение правила CORS в редких случаях может занимать до 30 секунд.

Частые проблемы