Заголовок S3 — Cloudfront — Access-Control-Allow-Origin

#amazon-web-services #amazon-s3 #cors #amazon-cloudfront

#amazon-веб-службы #amazon-s3 #cors #amazon-cloudfront

Вопрос:

У меня есть корзина s3, в которой я храню файлы hls, и мне нужно иметь возможность передавать эти файлы в проигрыватель, если использовать URL-адрес s3 по умолчанию, это работает, но это небезопасно.

Я прочитал и обнаружил, что вы можете использовать CloudFront и создать подписанный URL-адрес или файл cookie. Затем я создал новый дистрибутив со следующими параметрами

 Origin Domain Name: Name of my s3 bucket
Restrict Bucket Access: yes
Create a New Identity
Yes, Update Bucket Policy
Allowed HTTP Methods: GET, HEAD, OPTIONS
Cached HTTP Methods: select checkbox OPTIONS
Use legacy cache settings
And then I selected whitelist and choose
Access-Control-Request-Headers
Access-Control-Request-Method
Origin

  

И, наконец, я выбрал

 Restrict Viewer Access (Use Signed URLs or Signed Cookies): yes
  

После создания дистрибутива я попытался получить доступ к файлу через
zxxxx.cloudfront.net/ls/600/10/playlist.m3u8

И я получил отсутствующий параметр запроса пары ключей-идентификатора или значение cookie

До этого момента я думаю, что все работает нормально.

Я создал скрипт Ruby, чтобы получить эти учетные данные в

 CloudFront-Policy
CloudFront-Signature
CloudFront-Key-Pair-Id
  

Если затем я попытаюсь получить доступ к файлу, используя cookie или URL

 zxxxx.cloudfront.net/ls/600/10/playlist.m3u8?Policy=amp;Signature=amp;Key-Pair-Id
  

Я могу загрузить файл, это означает, что все снова работает нормально.

Проблема в том, что когда я пытаюсь получить доступ к файлу через мое приложение rails, я получаю сообщение: заблокирован политикой CORS

Я прочитал и обнаружил, что запрос должен быть из того же домена, чтобы иметь возможность отправлять cookie
Затем я добавил CNAME в свой дистрибутив cloudfront под названием cloud.example.com
И локально я создал запись в файле хоста под названием dev.example.com , порт 80

Снова попытался воспроизвести файл, и я все еще получаю ту же ошибку:

 'http://cloud.example/hls/600/10/playlist.m3u8' from origin 'http://dev.example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
  

CORS в корзине — это

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

Кто-нибудь может мне помочь?

Комментарии:

1. Вы включили метод параметров в cloudfront

2. Allowed HTTP Methods Опция в разделе «Поведение» cloudfront — это то, о чем я говорю.

3. Да, выбран параметр GET, HEAD, ПАРАМЕТРЫ, и в кэшированных методах HTTP я также установил флажок ПАРАМЕТРЫ

4. Я думаю, что проблема не в Cloudfront, я просто сделал запрос через Postman, установив файлы cookie, и я получаю файл. Я включил журналы Cloudfront и вижу файлы cookie в файле журнала. Но если сделать запрос через приложение rails, я не вижу файлов cookie в файле и получаю 403.

5. Фернандо, ты когда-нибудь это понимал?? Вы прекрасно описали мою ситуацию, и я здесь кручу свои колеса.