Частный контент CORS проблемы с S3 - PullRequest
0 голосов
/ 19 декабря 2018

Проблема

Я довольно долго ломал голову, пытаясь ориентироваться во многих трехбуквенных сервисах аббревиатур, окружающих экосистему 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.

Я вроде как в конце моей веревки с этимвся настройка, и я рассматриваю другие варианты, такие как прокси-сервер на бэкэнде, который обрабатывает авторизацию самостоятельно.Хотя разрешение всех источников не является для меня конечной целью, на данном этапе оно должно работать.У кого-нибудь есть идеи?

1 Ответ

0 голосов
/ 27 декабря 2018

content can only be displayed on the website to authenticated users and not be downloaded or publicly accessible

Ваш CF или S3 рассматривает все как не прошедшее проверку подлинности.Сконфигурируйте свой S3, чтобы разрешить все запросы от CF, и попробуйте Lambda @ Edge, чтобы проверить аутентификацию и разрешить или отклонить запрос.Другой вариант - использовать подписанный URL для S3, но это требует больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...