برای انجام عملیات `Authentication` روشهای متعددی وجود دارد. همچنین برای یادآوری و جلوگیری از تکرار این عملیات مکانیزمهای مختلفی طراحی شده است. در سالهای گذشته (و همچنین در حال حاضر) یکی از روشهای متداول برای به خاطرسپاری عملیات تشخیص هویت استفاده از `Cookie`ها بوده است.
اما با طراحی استاندارد `RFC 7519` و پیاده سازی آن در زبانهای مختلف، این روش محبوبیت و کاربرد زیادی پیدا کرده است.
در این سوال از شما میخواهیم که یک روال اعتبارسنجی کامل با این روش را پیاده سازی نمایید.
## ساختار پروژه
+ کل کدهای پروژه در یک فایل به نام `jwt.php` نوشته خواهد شد.
+ ساختار این فایل بسیار ساده بوده و تنها دارای ۲ تابع می باشد که بایستی با شرایطی که در قسمت بعد ذکر شده است تکمیل شوند.
+ فایل `users.json` حاوی یک آرایه از دادههای آزمایشی برای کاربران می باشد که برای انجام عملیات `Authentication` از محتوای این فایل باید استفاده کنید.
+ پروژه اولیه را میتوانید از [اینجا](https://quera.ir/qbox/download/UVZr1TAyFu/jwt.zip) دانلود کنید.
## توضیحات پروژه
+ برای تست و اجرای پروژه بهتر است با اجرای دستور `php -S 127.0.0.1:5555 -t ./` در پوشه برنامه از سرور `builtin` استفاده کنید (پورت و آدرس قابل تغییر است).
+ تابع `checkLogin` را به صورتی تکمیل کنید که با ارسال پارامترهای `username` و `password` از طریق متد `POST`، این دو پارامتر با اطلاعات موجود در فایل `users.json` تطبیق داده شده و در صورتی که اطلاعات صحیح باشد خروجی زیر با فرمت *JSON* چاپ شود:
```json
{"type":"login_success","token":"JWT_TOKEN"}
```
و در صورتیکه پارامترهای وارد شده با هیچ یک از اطلاعات موجود در فایل مطابقت نداشته باشد خروجی زیر چاپ شود:
```json
{"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* آپلود کنید.