Schützen von Downloads mit Django und Nginx
Da ich heute gefragt wurde wie bei einem Apache (für dynamische Daten) mit Ngnix (als Frontendproxy und statische Daten) einzelne Downloads oder Dateizugriffe mit Django kontrolliert werden können beschreibe ich hier eine Möglichkeit.
Nginx konfigurieren
Der Nginx soll die Daten nur auf "Zuruf" senden. Somit muss er daran erinnert werden, das er die Daten nicht bei einem einfachen GET zurückliefert. Das macht "internal".
location /protected-downloads/ {
alias /var/protected/;
internal;
}
Der Django-View
Unser View soll dem Nginx, der ja als Proxy zwischen dem Apachen und dem Browser sitzt ein Zeichen geben eine bestimmte Datei auszuliefern. Nginx verwendet dazu den Header: X-Accel-Redirect. Es reicht diesen mit einem Pfad zu senden um den Sendevorgang anzustoßen.
@login_required
def download(request, file=None):
response = HttpResponse()
response['Content-Type'] = 'application/octet-stream'
response['X-Accel-Redirect'] = '/protected-downloads/' + file
return response