Частное хранилище Django S3

Пользователи в моем django проекте могут загружать pdf файлы в частное хранилище. Это делается с помощью пакета django-private-storage - когда пользователь делает запрос на получение файла, django проверяет разрешения на него, а затем добавляет заголовок x-sendfile, чтобы apache обслужил файл.

Теперь я пытаюсь переместить все это в хранилище S3. Я не могу понять, как это сделать. Большинство информации, которую я нашел в Интернете, говорит мне, что нужно поместить личные файлы в личное ведро, а затем предоставлять ссылки с истекающим сроком действия. Мне не нравятся истекающие ссылки, и я не хочу раскрывать какие-либо ссылки S3. Одноразовые ссылки, возможно, подойдут.

Есть ли способ обслуживать файлы, не раскрывая прямых ссылок на S3 и не используя истекающие ссылки? Я что-то упускаю?

"Истекающие ссылки" - это S3 подписанные URL, которые действительны в течение периода, который вы можете определить своим запросом, и должны быть тем, что вы действительно ищете.

https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html

Использование предварительно подписанных URL-адресов для доступа клиента к подобным файлам не должно быть проблемой безопасности, если вы убедились, что разрешения файлов в вашем ведре приватны.

Хотя, если вы действительно хотите и после измерения влияния на вашу пропускную способность, вы можете проксировать передачу файлов через ваше приложение django, чтобы url ведра S3 не отправлялся на стороне клиента.

В итоге я использовал следующее: X-Accel-Redirect

Итак, файлы доступны пользователям по путям типа mysite.com/data/my_file.pdf

Django ожидает, что пользователь отправит GET-запрос с прикрепленным токеном, проверяет его и добавляет в ответ заголовки X-Accel-Redirect и S3 auth. Nginx (в моем случае) ловит этот заголовок и обслуживает файл из S3, перенаправляя запрос с прикрепленными заголовками на мой хост хранения S3.

Вернуться на верх