سلام توی این پست میخوام درباره امن نگه داشتن فایلها توی جنگو بنویسم و ببینیم چطور میشه روی دانلود فایلها کنترل داشت.
فرض کنید سایتی داریم که فایلها قراره فروشی باشن و در نتیجه هرکس مبلغ اون فایل رو پرداخت کرد بتونه به اون دسترسی داشته باشه. در حالت عادی که فایلها رو در دیسک ذخیره میکنیم و با وب سرور Nginx سرو میکنیم همه افراد میتونن با لینک مستقیم به اونا دسترسی داشته باشن و دانلود بکنن بدون اینکه جنگو مدیریت و کنترلی روی اونا داشته باشه ولی این چیزی نیست که اینجا بدرد ما بخوره.
راه حلش اینه که به طریقی به وب سرور بگیم که این فایلها رو مستقیم سرو نکن و اول برو از اپلیکشن اجازه بگیر و اگر کاربر مجاز بود اونوقت براش سرو کن. به این صورت جنگو ابتدا چک میکنه که کاربر اجازه دسترسی به فایلی که وب سرور میخواد سرو کنه را داره یا نه . اگر داشت ادامه کار سرو کردن رو میسپاره به Nginx که خیلی خوب از پس اینکارها برمیاد.
واسه اینکار میریم توی فایل کانفیک Nginx و محلی که فایلهای خصوصی در اون قرار دارند رو به اینصورت تعریف میکنیم:
location /protected/ { internal; alias/protected_files; }
اینجا میسر فایلهای خصوصی رو مشخص کردیم. در ادامه باید مسیری را در جنگو تعریف بکنیم که مسئول بررسی کردن و اجازه دادن هست و مثل یک دروازه ورودی عمل میکنه.
در اینجا برای تعریف دروازه ورودی یک View در جنگو درست میکنیم به اینصورت:
@login_required def download(request, file_id): myFile = VideoModel.objects.get(id=file_id) if not request.user.is_authenticated(): return render(request, "index.html") response = HttpResponse() response["Content-Disposition"] = "attachment; filename={0}".format( myFile.file.name) response['X-Accel-Redirect'] = "/protected/{0}".format(myFile.file.name) return response
اینجا هرگونه بررسی لازم باشه انجام میدیم و در نهایت با هدر هایی که قرار میدیم به وب سرور (در اینجا Nginx) میگیم که ریدایرکت کن و برو این فایل رو سرو کن بدون اینکه آدرس Url کاربر تغییر کنه. در واقع وب سرور با دیدن این هدر (X-Accel-Redirect) متوجه میشه که باید ریدایرکت داخلی بزنه به یه مسیر دیگه.
حالا کافیه بجای اینکه لینک مستقیم بدیم،کاربرها رو با آیدی فایل موردنظر هدایت کنیم به این ویو که ساختیم و اگر معتبر بود دانلود میشه به همین باحالی :)
https://example.com/download/45
امیدوارم که مفید بوده باشه اگر نظری پیشنهادی دارید خوشحال میشم بدونم و باهاتون در ارتباط باشم.