لینک‌های مفید برای شرکت در مسابقه:

در زمان مسابقه می‌توانید سوال‌های خود را از قسمت "سوال بپرسید" مطرح کنید.

PHP - تشخیص هویت با JWT


برای انجام عملیات Authentication روش‌های متعددی وجود دارد. همچنین برای یادآوری و جلوگیری از تکرار این عملیات مکانیزم‌های مختلفی طراحی شده است. در سال‌های گذشته (و همچنین در حال حاضر) یکی از روش‌های متداول برای به خاطرسپاری عملیات تشخیص هویت استفاده از Cookieها بوده است.

اما با طراحی استاندارد RFC 7519 و پیاده سازی آن در زبان‌های مختلف، این روش محبوبیت و کاربرد زیادی پیدا کرده است.

در این سوال از شما می‌خواهیم که یک روال اعتبارسنجی کامل با این روش را پیاده سازی نمایید.

ساختار پروژه🔗

  • کل کدهای پروژه در یک فایل به نام jwt.php نوشته خواهد شد.
  • ساختار این فایل بسیار ساده بوده و تنها دارای ۲ تابع می باشد که بایستی با شرایطی که در قسمت بعد ذکر شده است تکمیل شوند.
  • فایل users.json حاوی یک آرایه از داده‌های آزمایشی برای کاربران می باشد که برای انجام عملیات Authentication از محتوای این فایل باید استفاده کنید.
  • پروژه اولیه را می‌توانید از اینجا دانلود کنید.

توضیحات پروژه🔗

  • برای تست و اجرای پروژه بهتر است با اجرای دستور php -S 127.0.0.1:5555 -t ./ در پوشه برنامه از سرور builtin استفاده کنید (پورت و آدرس قابل تغییر است).

  • تابع checkLogin را به صورتی تکمیل کنید که با ارسال پارامترهای username و password از طریق متد POST، این دو پارامتر با اطلاعات موجود در فایل users.json تطبیق داده شده و در صورتی که اطلاعات صحیح باشد خروجی زیر با فرمت JSON چاپ شود:

    {"type":"login_success","token":"JWT_TOKEN"}
    JSON

    و در صورتیکه پارامترهای وارد شده با هیچ یک از اطلاعات موجود در فایل مطابقت نداشته باشد خروجی زیر چاپ شود:

    {"type":"login_failure","token":""}
    JSON

    واضح است که به جای عبارت JWT_TOKEN باید توکن معتبر و صحیح جایگذاری شود.

  • در نظر داشته باشید که JWT token تولید شده دارای زمان بوده و پس از گذشت مدت زمان معینی که بر اساس واحد زمان ثانیه، در ثابت TOKEN_LIFETIME در بالای فایل jwt.php ذکر شده است بایستی منقضی شود. لازم به ذکر است که این خط را از بالای فایل نباید حذف کنید و نام ثابت را هم نباید تغییر دهید (شما می توانید عدد زمان را تغییر دهید، این عدد در زمان ارزیابی پاسخ هم تغییر خواهد کرد).

  • با فراخوانی تابع getData باید حالت‌های زیر در نظر گرفته شود :

    • اگر token اعتبار سنجی در header درخواست وجود نداشته باشد یا طول آن 0 باشد پاسخ اسکریپت 403 Forbidden بوده و body باید تهی باشد. یعنی هیچ متن یا کاراکتری در خروجی نداشته باشیم و فقط این موضوع از طریق header به کلاینت اطلاع داده می شود.
    • اگر token نا معتبری به سمت اسکریپت ارسال شود بایستی header به صورت 401 Unauthorized بوده و در body عبارت INVALID_TOKEN به عنوان خروجی نمایش داده شود.
    • اگر token منقضی شده‌ای به سمت اسکریپت ارسال شود بایستی header به صورت 401 Unauthorized بوده و در body عبارت EXPIRED_TOKEN به عنوان خروجی نمایش داده شود.
    • اگر token صحیحی به سمت اسکریپت ارسال شود بایستی المان keys مربوط به کاربر صاحب token به صورت json encoded در خروجی چاپ شود (نیازی به تغییر header پاسخ نیست).

توجه داشته باشید که در موارد بالا HTTP Response Code وHTTP Response Verb بررسی خواهد شد.

برای پاسخ به این سوال می تواند از پکیج های composer هم استفاده کنید (هرچند که الزامی نیست و بدون نیاز به پکیج ها هم سوال قابل حل است) اما در صورت تمایل فایل composer.json را همراه با فایل jwt.php فشرده کنید و به عنوان جواب ارسال کنید.

آن چه باید آپلود کنید🔗

فایل پاسخ خود را با نام jwt.php ذخیره کرده و به صورت فایل ZIP آپلود کنید.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.