✍️ المقدمة:
في أحد المشاريع التي تطلبت حماية المحتوى الرقمي (مثل ملفات PDF أو فيديوهات خاصة بالعملاء)، طُلب مني إنشاء نظام يتيح للمستخدم تحميل الملف من رابط خاص ينتهي تلقائيًا بعد مدة محددة (مثل ساعة أو يوم).
بحثت عن حلول جاهزة، لكن معظمها إما مدفوعة أو معقدة. لذلك قررت بناء النظام بنفسي باستخدام Laravel فقط بدون أي مكتبات خارجية.
في هذا المقال سأشرح لك:
-
كيف أنشأت الروابط المؤقتة
-
كيف منعت الوصول غير المصرح به
-
وكيف أضفت عدًّا تنازليًا لانتهاء الصلاحية
🎯 ما الذي سنبنيه؟
نظام يقوم بالتالي:
-
✅ يسمح بتحميل الملف من رابط مخصص
-
✅ هذا الرابط صالح فقط لمدة زمنية محددة (مثل: 1 ساعة)
-
✅ عند انتهاء الوقت، يتم حظره تلقائيًا
-
✅ لا يمكن تخمين الرابط أو الدخول عليه إلا من صاحبه
🧱 تصميم قاعدة البيانات:
جدول downloads
Schema::create('downloads', function (Blueprint $table) {
$table->id();
$table->string('file_path');
$table->string('token')->unique();
$table->timestamp('expires_at');
$table->timestamps();
});
⚙️ منطق إنشاء الرابط المؤقت:
1. إنشاء رابط مؤقت للتحميل:
use Illuminate\Support\Str;
public function createDownloadLink(Request $request)
{
$token = Str::random(40);
$download = Download::create([
'file_path' => 'files/report.pdf',
'token' => $token,
'expires_at' => now()->addMinutes(60), // صالح لمدة ساعة
]);
return response()->json([
'url' => route('download.file', ['token' => $token])
]);
}
🔐 تأمين الرابط المؤقت:
2. إنشاء Route للتحميل باستخدام التوكن:
Route::get('/download/{token}', [DownloadController::class, 'handle'])->name('download.file');
3. التحقق من صلاحية الرابط:
public function handle($token)
{
$download = Download::where('token', $token)->firstOrFail();
if (now()->greaterThan($download->expires_at)) {
abort(403, 'انتهت صلاحية الرابط.');
}
return response()->download(storage_path('app/' . $download->file_path));
}
💡 كيف أضفت عدًّا تنازليًا في الواجهة (اختياري):
لو كنت تستخدم Vue أو أي واجهة JavaScript، يمكنك إضافة عداد:
// بسيط بـ JavaScript:
let timeLeft = 60 * 60; // ثانية واحدة لمدة ساعة
setInterval(() => {
timeLeft--;
const minutes = Math.floor(timeLeft / 60);
const seconds = timeLeft % 60;
document.getElementById("countdown").innerText = `${minutes}:${seconds}`;
if (timeLeft <= 0) {
alert("انتهت صلاحية الرابط");
window.location.href = "/";
}
}, 1000);
📌 ملاحظات أمنية مهمة:
(النقطة)◄ | (التوضيح) |
---|---|
(لا تستخدم أسماء ملفات حقيقية في الرابط)◄ | (لحمايتها من التخمين) |
(خزّن الملفات في storage/app/ وليس public )◄ |
(لمنع الوصول المباشر) |
(احذف السجلات القديمة بجدولة كرن (Scheduler))◄ | (مثلًا كل ساعة: Download::where('expires_at', '<', now())->delete(); ) |
(ضع صلاحيات للملف على السيرفر)◄ | (ليتم تحميله فقط من خلال Laravel) |
📈 النتيجة النهائية:
-
الروابط تعمل لمدة ساعة فقط
-
عند انتهاء الوقت، يتم منع التحميل تلقائيًا
-
لا يمكن مشاركة الرابط بشكل دائم
-
حماية فعالة للمحتوى الخاص أو المدفوع
🧾 الخلاصة:
إذا كنت تطور منصة تعليمية، أو تبيع ملفات رقمية، أو توفر تقارير حساسة، فإن الروابط المؤقتة هي أحد أفضل الحلول لحماية الملفات.
ما يميز Laravel أنك تستطيع بناء هذا النظام بدون أي مكتبات، بخطوات سهلة وآمنة، وتتحكم بكل التفاصيل.