Я использую предварительно назначенные 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.
Как обойти это?