Получение S3 CORS Access-Control-Allow-Origin для динамического эхо-запроса домена

Как настроить конфигурацию S3 CORS AllowedOrigin таким образом, чтобы динамически эхо-запрос запрашивающего домена в заголовке Access-Control-Allow-Origin?

В сообщении CORS с CloudFront, S3 и несколькими доменами предлагается установить AllowedOrigin на <AllowedOrigin>*</AllowedOrigin> делает это. Однако S3 возвращает Access-Control-Allow-Origin: *.

Access-Control-Allow-Origin: * не работает в моем случае, поскольку я использую image.crossOrigin = "use-credentials" в приложении JavaScript. С помощью этой опции S3 возвращает Access-Control-Allow-Credentials: true. Перекрестный доступ к изображению затем не выполняется, потому что с использованием шаблона, поскольку разрешенное происхождение в сочетании с учетными данными не разрешено.

Справочная информация о том, почему это необходимо:

В моей настройке доступ к изображениям на S3 должен проходить через наш домен, где для ограничения доступа требуется проверка подлинности, а также проверить, разрешено ли учетной записи доступ к изображениям. Если это так, сервер возвращает перенаправление 302 на URL-адрес S3.

Для работы аутентификации image.crossOrigin = "use-credentials" необходимо установить так, чтобы запрос удалил мой сервер с необходимыми учетными данными. (Кстати, когда я тестировал Firefox 30.0 и Chrome 35.0.1916.153, если crossOrigin установлен на anonymous, учетные данные по-прежнему отправляются, но не в Safari 7.0.4. Согласованное поведение между браузерами можно получить только с помощью use-credentials.).

Поскольку браузеры прозрачно перенаправляются на URL-адрес S3, также отправляются учетные данные.

Ответ 1

Документация AWS CORS не документирует это, но мне удалось получить ответ в потоке на форумах разработчиков AWS, где я обнаружил, что AWS изменило исходное поведение эхо запроса запрашивающего домена, если * используется для AllowedOrigin.

Чтобы заставить S3 динамически отбирать запрашивающий домен, AllowedOrigin должен быть установлен как таковой:

<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>

Ответ 2

Для меня это была какая-то проблема кеширования (хотя я не использовал cloudfront, только S3). При добавлении случайного параметра в URL-адрес исправлена ​​проблема для меня, например.

https://s3-amazon.com/bucket/file.jpg?d=3243253456346

У меня также были следующие настройки CORS в S3:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://*</AllowedOrigin>
        <AllowedOrigin>https://*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>