Получение 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>