Django и NGINX: как передать защищенные медиафайлы во внутреннюю программу просмотра?

в настоящее время я защищаю свои медиафайлы от несанкционированного доступа, как описано, например. здесь со следующей конфигурацией:

Медиафайлы расположены в /home/mysite/dproject/media/

В конфигурации nginx расположение медиафайлов задается следующим образом:

...
location /protected/ {
    internal;
    alias ../mysite/dproject/media/;
}
...

В urls.py я перенаправляю запросы на /media/ в представление с отказом в доступе:

urlpatterns = [
...  
re_path(r'^media/', login_required(PermissiondeniedView.as_view()), name='directmediaaccessdenied')
]

В settings.py заданы пути MEDIA_URL и MEDIA_ROOT:

MEDIA_ROOT = str(PROJ_DIR('media'))
MEDIA_URL = '/media/'

Чтобы предоставить файлы для загрузки, я использую в своих представлениях следующий код:

 response = HttpResponse()
 path = os.path.normcase( '/protected/' + filepath )
 del response['Content-Type']
 response['Content-Disposition'] = 'attachment; filename="%s"' % path
 response['X-Accel-Redirect'] = path
 return response  

Пока все работает так, как ожидалось, но я не могу предоставить данные встроенным средствам просмотра PDF или 3D.

Например, я использую средство просмотра для отображения 3D-файлов (источник взят из здесь). Путь к файлу передается с хеш-параметром, поэтому допустимый URL-адрес представления со встроенным просмотрщиком выглядит так:

https://mysite.mydomain.com/3Dview/#model=/protected/path/to/file.ext

С описанной выше конфигурацией вьюверу не удается загрузить файл. Средство просмотра работает, когда я меняю URL на

https://mysite.mydomain.com/3Dview/#model=/media/path/to/file.ext

и конфиг nginx для:

...
location /media/ {
    alias ../mysite/dproject/media/;
}
...

но затем медиафайлы можно просматривать и загружать без входа в систему снова.

Любые подсказки о том, как предоставлять защищенные медиафайлы встроенным программам просмотра, приветствуются!

Задавать вопросы — это искусство, которым я не владею. Так что не стесняйтесь, дайте мне знать, если что-то нуждается в разъяснении или если информация отсутствует.

Заранее спасибо и с наилучшими пожеланиями Крис


person Chris    schedule 28.06.2021    source источник