Проблема
Я довольно долго ломал голову, пытаясь ориентироваться во многих трехбуквенных сервисах аббревиатур, окружающих экосистему AWS.
Что я хочу сделатьявляется отображением контента (pdf, изображений, видео) на веб-сайте, на котором этот контент может только отображаться на веб-сайте для аутентифицированных пользователей и не может быть загружен или общедоступен .
Моя проблема в том, что независимо от того, что я пытаюсь, если не дать полный публичный доступ к корзине, выдает ошибку 403 при запросе содержимого изображения из внешнего интерфейса .
Архитектура приложения представляет собой интерфейсное приложение JS, обслуживаемое через дистрибутив CloudFront, размещенный на S3.Это связано с серверной частью, размещенной на EC2.
То, что я пробовал до сих пор
Конфигурация CORS
Документация по теме, похоже, намекаетпросто создать правила CORS, чтобы разрешить доступ к объектам в корзине с моего веб-сайта.
Я создал политику CORS, аналогичную следующей для корзины, которая должна разрешать доступ к объектам в корзине:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*.websitename.com</AllowedOrigin>
<AllowedOrigin>https://*.websitename.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Не повезло, ошибка 403 .Чтобы проверить, может ли это быть чем-то отличным от конфигурации CORS, я открыл политику CORS, чтобы попытаться разрешить общедоступный доступ CORS к корзине, например:
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Не повезлоздесь либо , кто-то другой в stackoverflow упомянул, что была небольшая задокументированная проблема с AllowedOrigin: *
, и попытался сделать следующее:
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://*</AllowedOrigin>
<AllowedOrigin>https://*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Один пользователь указывает на stackoverflow, что контент с прямой связью нене отправлять заголовок Origin
по умолчанию, что означает, что S3 затем интерпретирует его как внутренний запрос и отправит запрещенную ошибку 403.Решением этой проблемы является добавление crossorigin="anonymous"
к тегу изображения.
После добавления этого атрибута в тег img
заголовки подтверждаются для правильной отправки .Он отправляет правильный Origin: mywebsitename.com
в заголовке запроса, и я даже получаю правильный response
заголовок разрешенных источников, включая мой веб-сайт.
Проблемы распространения Cloudfront
Согласно этот ответ, облачный фронт по умолчанию не перенаправляет заголовки на S3.Я сделал шаг вперед, переместив все заголовки, включая Access-Control-Allow-Methods
и Access-Control-Allow-Origin
.
Кроме того, другой человек предположил, что иногда у Cloudfront возникают странные проблемы с кэшированием.Я добавил случайную строку запроса к изображению, и с тем же результатом.
После того, как оба по-прежнему 403.
Я вроде как в конце моей веревки с этимвся настройка, и я рассматриваю другие варианты, такие как прокси-сервер на бэкэнде, который обрабатывает авторизацию самостоятельно.Хотя разрешение всех источников не является для меня конечной целью, на данном этапе оно должно работать.У кого-нибудь есть идеи?