برای انجام عملیات 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"}
و در صورتیکه پارامترهای وارد شده با هیچ یک از اطلاعات موجود در فایل مطابقت نداشته باشد خروجی زیر چاپ شود:
{"type":"login_failure","token":""}
واضح است که به جای عبارت
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 آپلود کنید.
ارسال پاسخ برای این سؤال