برای انجام عملیات 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 آپلود کنید.
ارسال پاسخ برای این سؤال