Частное хранилище 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.