یکی از ویژگیهای پرکاربرد لاراول Signed URL ها هست . این ویژگی برای اضافه کردن یک لایه امنیتی بیشتر به آدرسهایی که بصورت عمومی در دسترس هستن استفاده میشه .
فرض کنیم یک سرویس خبرنامه ایمیلی داریم و میخوایم برای کاربرانی که مایل به دریافت خبرنامه نیستن یک لینک لغو اشتراک بسازیم . برای مثال لینک لغو عضویت برای کاربر شماره ۹۰ میتونه به صورت زیر باشه :
http://example.com/unsubscribe/90
وقتی این کاربر روی این لینک کلیک میکنه دیگه هیچ ایمیلی دریافت نخواهد کرد . حالا تصور کنین یک شخص که به این لینک دسترسی داره ، اون رو دستکاری میکنه و بجای ۹۰ ، از شماره ۸۰ استفاده میکنه . در صورت عضویت ایمیل کاربر شماره ۸۰ هم لغو میشه ! و به این صورت میتونه برای بقیه کاربرا هم این عملیات رو انجام بده .
یه راه حل میتونه فعال کردن احراز هویت برای این لینک باشه . اما معمولاً لغو خبرنامههای ایمیلی بدون نیاز به احراز هویت انجام میشه و یا چون توسط سرویسهای شخص ثالث و مجزا ارسال میشن ، احراز هویت کاربردی نداره . اینجاست که Signed URL های لاراول به کار ما میان
همونطور که میبینیم یک پارامتر به اسم signature به آخر این آدرس اضافه شده که اختصاصی برای این آدرس هست . اگه یکی از خصوصیتهای آدرس (مثلاً user_id) عوض بشه ، این آدرس نامعتبر و ادامه فرآیند متوقف میشه .
اعتبارسنجی آدرسهای Signed
ابتدا میدلور زیر رو به قسمت $routeMiddleware فایل app/Http/Kernel.php اضافه کنیم :
از حالا به بعد ، این روت زمانی به درستی کار میکنه که پارامتر signature با مقدار معتبر وجود داشته باشه . اگه signature نامعتبر باشه ، کد خطای ۴۰۳ در http با پیام invalid signature مانند تصویر زیر را میگیریم :
Signed URL های موقت
میتونیم آدرسهایی تولید کنیم که بعد از مدت زمانی مشخصی باطل میشن . برای این کار ، توی پارامتر سوم متد signedRoute مشخص میکنیم که تا چه زمانی این آدرس معتبر هست :
اینجا آدرسی که تولید میشه تا ۳۰ دقیقه معتبر خواهد بود . البته یک متد اختصاصی هم به اسم temporarySignedRoute برای این کار وجود داره که تفاوت چندانی با کاری که انجام دادیم نداره و فقط موقعیت آرگومانها تغییر پیدا میکنه :