معرفی احراز هویت Token در php

  • آپدیت شده در تاریخ

معرفی احراز هویت Token در php

در این آموزش قصد معرفی احراز هویت Token در php را داریم .احراز هویت یکی از مهم‌ترین قسمت‌های هر اپلکیشن تحت وب هست که ما از این طریق می توانیم دسترسی های خاصی را به کاربر اختصاص بدیم .

ولی همانطور که میدانید HTTP یک پروتکل stateless است و نمی تواند تشخیص دهد که کاربر قبلا این درخواست را ارسال کرده و یا چه کسی این صفحات را مرور کرده است برای همین یک مورد به نام state management مطرح است تا بتوانیم کاربران را از هم تفکیک و دسترسی هایی را برای آنها فراهم کنیم .

هر درخواستی که از طرف کلاینت ارسال می شود باید شامل اطلاعاتی برای ادامه پروسه درخواست (request) باشد که این اطلاعات می تواند نام کاربری و پسورد , کوکی ها , session id ذخیره شده در کوکی و یا توکن باشد .

 

در این مقاله آموزشی قصد داریم به شما روش دیگری برای احراز هویت کاربر معرفی کنیم و تفاوت آن را با روش استفاده از $_SESSION نشان دهیم

تفاوت احراز هویت Session و JWT

احراز هویت سیشن

  1. کاربر نام کاربری و کلمه عبور رو وارد و روی دکمه ورود کلیک میکنه .
  2.  بعد اینکه درخواست فرستاده شد، سمت back-end با استفاده از query گرفتن از دیتابیس هویت کاربر تصدیق میشه. و اگه اطلاعات درست بود یه session با استفاده از اطلاعات گرفته شده از دیتابیس ساخته میشه، و بعدش اطلاعات session تو هدر فرستاده میشد و session id تو مرورگر ذخیره میشه.
  3.  با اطلاعات session مرورگر درخواست اجازه دسترسی به مناطق ممنوعه اپلیکیشن رو میخواد.
  4. و اگه session درست و مطابق دیتابیس بود اپلیکیشن اجازه دسترسی و رندر صفحه html رو میده.

معرفی احراز هویت Token در php

همه چیز تا این نقطه داره خوب کار میکنه و اپلیکیشن یه سری قسمت‌های ممنوعه داره و کاربران با اجازه دسترسی در حال مشاهده اون قسمت‌ها هستن. حالا مشکل اونجاست که ما می‌خوایم یه کلاینت دیگه بسازیم مثل Android یا اپلیکیشن دسکتاپ ؟

آیا شما می‌تونید با این اپلیکیشنی که برای احراز هویت استفاده می‌کنید برای کلاینت های موبایل و … اجازه دسترسی به قسمت‌های اپلیکیشن رو بدید؟ اگه با همین روش بخواید احراز هویت کنید نمیشه، چرا ؟

به خاطر دو دلیل زیر :

  • session و cookie ها برای کلاینت‌های موبایل هیچ مفهومی نداره و شما نمی تونید session یا cookie رو با اپلکیشن موبایل به اشتراک بگذارید و استفاده کنید.
  • تو این سیستم جوابی که از طرف سرور میاد یه صفحه html هست و شما نیاز به JSON یا XML دارید تا اپلیکشن موبایل بتونه اونو پردازش کنه. تو این حالت شما یه سیستم مستقل از کلاینت دارید.

احراز هویت Token

تو سیستم احراز هویت بر اساس Token شما نمی‌تونید از session و cookie استفاده کنید. حالا بیاید سناریوی سیستم قبلی رو برای Token ریدیزاین کنیم، روش Token از الگوریتم زیر استفاده میکنه :

  1. کاربر نام کاربری و کلمه عبور رو وارد میکنه و روی دکمه ورود کلیک میکنه
  2. بعد اینکه درخواست فرستاده شد، در سمت back-end با استفاده از query گرفتن از دیتابیس هویت کاربر تصدیق میشه. و اگه اطلاعات درست بود یه token با استفاده از اطلاعات گرفته شده از دیتابیس ساخته میشه. و ما هم می‌تونیم این token رو سمت کلاینت ذخیره کنیم.
  3. هر دفعه همراه هر درخواست باید این token رو بفرستیم.
  4. اگه token فرستاده شده صحیح باشه اجازه دسترسی به اون قسمت اپلیکشین رو میدیم و در هدر جواب رو به صورت XML یا JSON میفرستیم.

ما تو این حالت دیگه نه session و نه cookie بر می گردونیم و نه صفحه html، این یعنی ما می‌تونیم از این ساختار برای هر اپلیکیشنی استفاده کنیم. شمای ساختار رو می تونید تو تصویر زیر ببنید.

معرفی احراز هویت Token در php

JWT چیست ؟

JWT مخفف Json Web Token و فرمتی برای استفاده از آن در  هدرهای احراز هویت است. این Token به شما کمک میکنه که ارتباط بین دو سیستم رو به صورت امن طراحی کنید. در این مطلب ما  JWT رو “bearer token” فرض میکنیم، bearer token شما از سه قسمت تشکیل شده :

  • header : نوع توکن و و همچنین الگوریتم رمزگذاری (type of signature) رو ذخیره میکنه که در مثال از رمزگذاری base-64 استفاده شده .
  • payload شامل اطلاعات هست . شما هر مدل داده‌ای از جمله اطلاعات یوزر و هر چی که می‌خواید رو می‌تونید به صورت رمزگذاری شده base-64 در اینجا ذخیره کنید.
  • signature شامل ترکیبheader , پی لود(payload)  و کلید رمز (secret key) هست. کلید رمز باید روی سرور به صورت امن نگه داشته بشه.

ساختار JWT و یه مثال از Token در عکس زیر قابل مشاهده هست.

معرفی احراز هویت Token در php

JWT Header بالا نوع encoded object را به صورت JSON Web Token و همچنین الگوریتم تبدیل را HMAC SHA-256 نیز مشخص کرده است.

در این جا اولین بخش اطلاعات یک JSON Web Token را می توانید مشاهده کنید.

در این آموزش یک مفهوم کلی از JWT  و تفاوت های آن با روش سیشن و کوکی را نشان دادیم. و همانطور که دیدید ساختار احراز هویت Token بصورت JWT بسیار جالب و چالش برانگیز است و هنگامی که قصد استفاده از آن به صورت cross-platform بین اپلیکشن های اندروید و دسکتاب داریم می تواند بسیار کارا باشد.

 

در مقاله آموزشی بعد بطور عملی نحوه استفاده از JWT در احراز هویت REST API ها در php را خواهیم دید . (احراز هویت توکن در php با JWT)

هر سوالی در مورد احراز هویت Token در php داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .

موفق و پیروز باشید

حسن شفیعی علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. توصیه من: هاست میهن وب‎هاست
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۱۰)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. محسن ۱۵ تیر ۱۳۹۹

    سلام. ممنون از وقتی که گذاشتید و توضیح عالی که دادید.

    پاسخ
    1. حسن شفیعی ۱۵ تیر ۱۳۹۹

      سلام. خوشحالیم که مفید واقع شده.
      موفق باشید.

      پاسخ
  2. علی ۲۰ آذر ۱۳۹۸

    سلام دوست عزیز،
    سوالی که بیش از چند ماه هست منو درگیر کرده و اگه بتونی راهنماییم کنی خیلی ممنون میشم.
    استفاده از توکن روشی است برای استفاده به جای سشن ها ؟
    یا بهتر بگم توی لاراول وقتی از jwt یا passports استفاده میکنیم دیگه نیاز نیست route ها رو توی web بنویسیم و همه routeها در api نوشته میشن؟

    پاسخ
    1. حسن شفیعی ۲۱ آذر ۱۳۹۸

      سلام.
      بله دقیقا خوب متوجه موضوع شدید.
      موفق باشید.

      پاسخ
  3. Aref ۳ آذر ۱۳۹۷

    خیلی ممنون
    پس میشه نتیجه گرفت که jwt یه روش برای بسته‌بندی اطلاعات انتقالی (شامل توکن، اطلاعات،‌ نوع رمزنگاری و امضا) هستش و امنیت بیشتری داره، که وابسته به نوع ارتباط ما اعم از توکن ساده یا Oauth نیست و میشه در هر دو ازش استفاده کرد.
    درسته ؟

    پاسخ
    1. حسن شفیعی ۳ آذر ۱۳۹۷

      خواهش می کنم. بله درسته کاملا متوجه موضوع شدید .
      موفق باشید.

      پاسخ
  4. Aref ۲ آذر ۱۳۹۷

    سلام خیلی ممنون از مقاله های خوبتون
    ببخشید بنده یه سوال دارم.
    من برنامه نویسه اندروید هستم و دیگران به شدت توصیه میکنن که از احراز هویت Oauth استفاده کنم،‌در حالی که بنده اصلا اطلاعی از این که این روش چی هست، کاربردش تو اندروید چیه و چرا باید استفاده کنم نمیدونم؟
    و یه موردی هم که هست اینه که تا وقتی که من همون روش رایج همیشگی رو بلدم (همون روشی که توش به هر کاربر یه token اختصاص میدیم و وقتی لاگین کرد و اطلاعتش درست بود،‌ از اون به بعد تو درخواست ها از توکن استفاده میکنیم) چرا باید برم سراغ Ouath
    لطفا بندرو راهنمایی کنید
    ممنون

    پاسخ
    1. حسن شفیعی ۳ آذر ۱۳۹۷

      سلام. خوشحالم که مفید واقع شده.
      تفاوت زیادی نداره . oauth هم همانند روشی که الان شما دارید استفاده می کنید یک توکن رو که بی معنی و فقط یک رشته منحصربه فرد هستش ایجاد می کنه (مجوز authorization ) و از آن به بعد برای احراز هویت و درخواست ها بهره می بره. (authentication)
      کاری که oauth انجام میده ینه که فقط به شما روش های مختلف دیگری برای ارتباط با سیستم های احراز هویت پیچیده میده و استفاده از oauth و یا همین ساختن توکن بر اساس روش خودتون زیاد تفاوتی ایجاد نمی کنه و از اون معمولا برای استاندارد شدن ارتباط بین وب سرویس و اپ استفاده میشه.

      ولی jwt هایی که اینجا معرفی کردیم کمی فراتر از توکن و oauth هستش چرا که توکنی که ایجاد کردیم یک رشته بی معنی نیستش بلکه یک سری عملیات cryptography و sign روش انجام شده و بعد از تجزیه رشته می توانیم اطلاعات را در فرمت استاندارد json هم بخونیم.

      موفق باشید.

      پاسخ
  5. nariman ۳۰ فروردین ۱۳۹۷

    بسیار جالب بود تشکر از زحمتتاتون

    پاسخ
    1. حسن شفیعی ۳۰ فروردین ۱۳۹۷

      سلام . خوشحالم که مفید واقع شده .
      موفق و پیروز باشید.

      پاسخ
دوره های آموزشی