Относительные URL шрифта в CSS вызывают 403 на S3 - PullRequest
0 голосов
/ 24 сентября 2018

Я использую предварительно назначенные URL-адреса с помощью boto3 для «защиты» (или, по крайней мере, ограничения доступа) к содержимому, хранящемуся на S3 (я передаю относительный путь к представлению Django, а затем генерирую абсолютный предварительно назначенный URL-адрес к месту храненияна S3, затем передайте это как перенаправление клиенту, который затем получит ожидаемый файл):

import boto3    

class ContentStreamView(LoginRequiredMixin, RedirectView):


    def get_redirect_url(self, **kwargs):
         ... relevant code below
        s3_client = boto3.client('s3',
                      aws_access_key_id=self.storage_details.access_key,
                      aws_secret_access_key=self.storage_details.secret_key,
                      config=Config(signature_version=self.storage_details.signature_version))

        # Key will equal the filepath to the content required.
        return s3_client.generate_presigned_url(
            ClientMethod='get_object',
            ExpiresIn=60,
            Params={
                'Bucket': self.storage_details.bucket_name,
                'Key': kwargs['filepath']
            }
        )

    ... passes the URL back to the client in the get method of the CBV

    def get(self, request, *args, **kwargs): 
        ...
        url = self.get_redirect_url(filepath=path)
        return HttpResponsePermanentRedirect(url)

У меня установлена ​​корзина CORS на S3, как показано ниже:

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

У меня есть настройка CORS с Django, чтобы разрешить все:

CORS_ORIGIN_ALLOW_ALL = True

Например, когда браузер пытается получить доступ к https://myapp.com/streamer/some_folder/css/some_css_file.css, браузер перенаправляется (и получает файл, как и ожидалось), чтобыпредопределенный URL-адрес S3: https://examplebucket.s3.amazonaws.com/some_folder/css/some_css_file.css?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=credentials%2Faws4_request&X-Amz-Date=20180924T145056Z&X-Amz-Expires=60&X-Amz-SignedHeaders=host&X-Amz-Signature=signature.

Это прекрасно работает, НО , относительные URL в файле css (для шрифтов и, вероятно, изображений) возвращают 403 с.

Определены относительные URL (например):

some_css_file.css

...
 @font-face {
  font-family: 'Avenir LT';
  font-weight: normal;
  font-style: normal;
  src: url('../Fonts/AvenirLTStd-Book.otf');
} 
....

Когда клиент пытается получить доступ к src: url('../Fonts/AvenirLTStd-Book.otf');, относительные URL в файле возвращают 403sскорее всего, потому что ведро заблокировановниз, и для доступа к этим путям потребуется подписать URL.

Как обойти это?

...