آموزش jwt
jwt یکی از برترین روشهای احراز هویت می باشد که در برنامه های api کاربرد دارد . jwt مخفف Json Web Token می باشد به معنای توکن جی سان برای وب در واقع شما با احراز هویت بوسیله jwt خیالتان راحت می باشد که برنامه های شما غیر قابل نفوذ می باشد.
به منظور آموزش rest api پیشنهاد می شود مقاله زیر را مطالعه نمایید:
سیستم های احراز هویت سنتی
قبل اینکه در مورد سیستم های احراز هویت بر اساس Token صحبت کنیم بهتره که نگاهی به سیستمهای سنتی بیاندازیم.
- کاربر نام کاربری و کلمه عبور رو وارد میکنه و روی دکمه ورود کلیک میکنه .
- بعد اینکه درخواست فرستاده شد، سمت back-end با استفاده از query گرفتن از دیتابیس هویت کاربر تصدیق میشه. و اگه اطلاعات درست بود یه session با استفاده از اطلاعات گرفته شده از دیتابیس ساخته میشه، و بعدش اطلاعات session تو هدر فرستاده میشد و session id تو مرورگر ذخیره میشه.
- با اطلاعات session مرورگر درخواست اجازه دسترسی به مناطق ممنوعه اپلیکیشن رو میخواد.
- و اگه session درست و مطابق دیتابیس بود اپلیکیشن اجازه دسترسی و رندر صفحه html رو میده.
همه چیز تا این نقطه داره خوب کار میکنه و اپلیکیشن یه سری قسمتهای ممنوعه داره و کاربران با اجازه دسترسی در حال مشاهده اون قسمتها هستن. حالا مشکل اونجاست که ما میخوایم یه کلاینت دیگه بسازیم مثل اندروید یا اپلیکیشن دسکتاپ؟ آیا شما میتونید با این اپلیکیشنی که برای احراز هویت استفاده میکنید برای کلاینت های موبایل و … اجازه دسترسی به قسمتهای اپلیکیشن رو بدید؟ اگه با همین روش بخواید احراز هویت کنید نمیشه، چرا ؟ به خاطر دو دلیل زیر :
- session و cookie ها برای کلاینتهای موبایل هیچ مفهومی نداره و شما نمی تونید session یا cookie رو با اپلکیشن موبایل به اشتراک بگذارید و استفاده کنید.
- تو این سیستم جوابی که از طرف سرور میاد یه صفحه html هست و شما نیاز به JSON یا XML دارید تا اپلیکشن موبایل بتونه اونو پردازش کنه. تو این حالت شما یه سیستم مستقل از کلاینت دارید
سیستم احراز هویت بر اساس Token
تو سیستم احراز هویت بر اساس Token شما نمیتونید از session و cookie استفاده کنید. حالا بیاید سناریوی سیستم قبلی رو برای Token ریدیزاین کنیم، روش Token از الگوریتم زیر استفاده میکنه :
- کاربر نام کاربری و کلمه عبور رو وارد میکنه و روی دکمه ورود کلیک میکنه
- بعد اینکه درخواست فرستاده شد، در سمت back-end با استفاده از query گرفتن از دیتابیس هویت کاربر تصدیق میشه. و اگه اطلاعات درست بود یه toekn با استفاده از اطلاعات گرفته شده از دیتابیس ساخته میشه. و ما هم میتونیم این token رو سمت کلاینت ذخیره کنیم.
- هر دفعه همراه هر درخواست باید این token رو بفرستیم.
- اگه token فرستاده شده صحیح باشه اجازه دسترسی به اون قسمت اپلیکشین رو میدیم و در هدر جواب رو به صورت XML یا JSON میفرستیم.
ما تو این حالت دیگه نه session و نه cookie بر می گردونیم و نه صفحه html، این یعنی ما میتونیم از این ساختار برای هر اپلیکیشنی استفاده کنیم. شمای ساختار رو می تونید تو تصویر زیر ببنید.
jwt شامل سه بخش می باشد
- header : نوع توکن و رمزگذاری رو ذخیر میکنه که در مثال از رمزگذاری base-64 استفاده شده .
- payload شامل اطلاعات هست . شما هر مدل دادهای از جمله اطلاعات یوزر و هر چی که میخواید رو میتونید به صورت رمزگذاری شده base-64 در اینجا ذخیره کنید.
- امضا شامل ترکیبheader , پی لود(payload) و کلید رمز (secret key) هست. کلید رمز باید روی سرور به صورت امن نگه داشته بشه.
در صورتی که به وب سایت jwt مراجعه نمایید مشاهده می کنید در صفحه اول یک دمو از jwt گذاشته است که به صورت زیر می باشد:
در تصویر بالا مشاهده می فرمایید که بعد از تفسیر شدن قسمتهای راست به قسمت سمت چپ تبدیل می شود و فقط کلاینتی که باید آن را تفسیر نماید تفسیر می نمایدو جالب تر از آن این است که شما نیازی نیست این الگوریتمها را بنویسید با هر زبانی که کار کنید لایبرری آن در گیت هاب موجود است و شما می توانید در صفحه اول وب سایت jwt آن را یافت نموده و استفاده نمایید .
نحوه احراز هویت
به منظور احراز حویت در jwt شما می بایست : پس از تایید حویت توسط برنامه و چک کردن با بانک اطلاعاتی شما می بایست اطلاعات را به سمت کلاینت برگردانید که یک توکن است و کلاینت در جایی ذخیره می کند مثلا در کوکی و در هر با که نیاز است به اطلاعات مهم از سمت سرور شما می بایست آن توکن که شامل اطلاعات است را در توکن ارسال نمایید.
این یک مکانیزم احراز هویت بدون بار اطلاعاتی است، زیرا وضعیت کاربر هرگز در حافظه سرور ذخیره نمی شود. قسمتهای حفاظت شده سرور برای یک JWT معتبر در Header Authorization بررسی می شوند و اگر در حال حاضر، کاربر مجاز به دسترسی به منابع محافظت شده باشد به آنها دسترسی پیدا می کند و چون که JWT ها مستقل هستند، تمام اطلاعات لازم در آن وجود دارد، و نیاز به پرس و جو از پایگاه داده نیست ارتباط با بانک اطلاعاتی به مقدار زیادی کاهش می یابد.
نمودار زیر این روند را به خوبی نشان می دهد:
حالا که به روند jwt به خوبی آشنا شدیم می پردازیم به jwt در php
همانگونه که در صفحه اول وب سایت jwt مشهاده می کنید افزونه های مناسبی به منظور jwt در php وجود دارد که شما می توانید به راحتی انها را دانلود نمایید و استفاده نمایید.
همراه ما باشید در معرفی کاربردی jwt در php و فریم ورکهای آن