احراز هویت توکن در php با JWT

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

شاید علاقه مند باشید که احراز هویت (Authentication) در وب چگونه انجام می شود ؟ در مقاله قبلی به معرفی احراز هویت توکن در php با سیشن و jwt پرداختیم . در این آموزش , قصد داریم بصورت کاملتر و البته عملی احراز هویت JWT در php را نشان دهیم .

در مقابل نشست ها (Sessions)

قبلا تنها راه برای برطرف کردن مشکل stateless بودن HTTP و احراز هویت خودتان در یک بخش مدیریت برنامه تحت وب وارد کردن اطلاعات ورود بود .

بعدها سرویس API ها وارد شدند و ارسال اطلاعات ورود بصورت متن ساده (plain text) قابل قبول نبود.  امروزه ایده توکن API ها مطرح است و بسیاری از این روش استفاده می کنند .

 

یکی از معایب وارد کردن اطلاعات ورود و برقرار کردن وضعیت (state) کاربر برای ارتباط با اپلیکیشن توسط کوکی های سئشن موارد زیر بود :

  • داده ها بصورت متن ساده در سرور ذخیره می شد

هرچند که داده ها در فولدر عمومی ذخیره نمی شود , هرکسی دسترسی خواندن فایل های سئشن را داشت (امنیت سیشن در php)

  • درخواست های خواندن/نوشتن (read/write) فایل سیستم

هر بار که سیشن استارت میشد یا داده های آن تغییر پیدا می کرد . سرور نیاز داشت که فایل سیشن را بروزرسانی کند. این عملیات با هر بار ارسال سیشن کوکی ها تکرار می شد.

که در نهایت اگر تعداد کاربران زیادی داشتید , باعث کاهش سرعت سرور می شود.

 

زمانی که با سرویس های API سروکار دارید , نیاز است که برای هر درخواستی که ارسال می کنید , کلید (key) خود را هم همراه ان ارسال کنید (در هدر درخواست مانند Authorization , api-key و یا در url بصورت querystring) .

JWT

از اکتبر ۲۰۱۰ ,سرویس های زیادی از توکن های مبتنی بر JSON استفاده می کنند . JWT یا JSON Web Token دارای مشخصات زیر است :

  1. مورد استفاده در محیط هایی با فضای کاراکتری محدود مثل هدرهای احراز هویت HTTP یا پارامتر های querystring است.
  2. داده ها باید به فرمت JSON یا همان Javascript Object Notation انتقال پیدا کنند.
  3. داده باید دارای تکه کدی از امضای json باشد.
  4. بصورت اینکودینگ Base64  برگشت داده می شود.

JSON Web Signature یک مکانزیم رمزنگاری است که برای امن کردن داده با یک امضای دیجیتال است که برای توکن استفاده می شود تا از اینکه آیا داده دستکاری شده و یا توسط فرد دیگری دزدیده و دوباره استفاده شده یا نه .

 

مزایای استفاده از JWT ها به جای یک Api Key

Api Key ها فقط یک رشته تصادفی هستند در حالی که JWT ها شامل اطلاعات و متا-داده (metadata)هایی که میتواند idکاربر , اطلاعات احراز هویت ذخیره و  اعتبار سنجی توکن بر اساس زمان یا دامنه را انجام دهد.

  • JWT ها نیاز به یک منبع متمرکز برای صدور/لغو مجوز ندارند.
  • با OAUTH2 سازگار است.
  • داده های JWT قابل بررسی دوباره است .
  • توانایی کنترل بر تاریخ انقضای JWT ها وجود دارد.

 

رشته JWT به چه صورت است ؟

یک JWT رشته ای مشابه زیر است :

شاید بنظر برسد که یک رشته با کاراکتر های تصادفی است که به هم متصل شدند. و با API key ها تفاوتی ندارند. به هر حال اگر به دقت نگاه کنید , ۳ رشته متفاوت با نقطه (.) از هم جدا شده اند .

رشته اول و دوم رشته های JSON بصورت Base64 اینکد شده اند و اگر آنها را دیکد کنید نتیجه زیر را خواهید دید:

  1. رشته اول هدر JWS است که نشان دهنده الگریتم رمزنگاری شده برای ساخت payload است و همچنین نوع پیلود را مشخص میکند .
  2. رشته دوم خود payload است که همراه چند فیلد استاندارد , هر داده ای که قصد داشتید را با توکن ارسال می کنید .
  3. رشته سوم یک امضای رمزنگاری شده است و بصورت داده باینری دیکد می شود .

چیزی که در مورد امضای JWT است , نوع الگریتم رمزنگاری هستش که نیاز به یک secret key دارد , رشته ای که فقط خود اپلیکیشن آن را می داند و به هیچ طریقی نباید لو رود .

به اینصورت وقتی اپلیکیشن ,توکن را دریافت می کند ,  JWT Signature یا همان امضا را بر طبق توکن را با secret key می تواند اعتبارسنجی کند . اگر تایید موفقیت آمیز نبود , می توانید اطمینان پیدا کنید که داده داخل توکن دستکاری شده است و باید درخواست پس زده شود .

می توانید با مراجعه به jwt.io با انواع encoding,decoding های JWT آشنا شوید .

انجام عملی احراز هویت توکن در php با JWT

خب فرض کنیم یک مکانیزم لاگین با استفاده از سئشن و کوکی ها را داریم . البته توجه کنید JWT جایگزین سئشن و کوکی ها نیست . به هر حال برای این مثال چند سرویس خواهیم داشت : یکی برای ساخت یوزنیم و پسورد و دیگری هم برای ارایه یک ریسورس محافظت شده ای که با JWT معتبر قابل دسترس است.

احراز هویت توکن در php با JWT

همینکه لاگین شدیم , میتوانیم به منابع محافظ شده از اپلیکیشن دسترسی داشته باشیم .

برای شروع احراز هویت توکن در php با JWT , php-jwt را با کامپوزر composer require firebase/php-jwt (composer چیست) نصب می کنیم . همچنین اپلیکیشن نمونه برای این آموزش توسعه داده شده است . همچنین از zend-config , zend-http بهره می بریم که اگر دوست داشتید میتوانید آن ها را بصورت زیر نصب کنید:

یک کتابخانه php دیگر نیز برای JWT وجود دارد (jose) که می توانید از آن استفاده کنید.

حالا فرض کنیم که فرم لاگین اطلاعات را به سرویس JWT ما از طریق AJAX ارسال می کند , زمانی که اطلاعات ورود با اطلاعات ذخیره شده دیتابیس بررسی و تایید شد , ما توکن را می سازیم .

ابتدا آن را بصورت یک آرایه می سازیم :

برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود

لطفا توجه کنید که ساختار داده را به هر صورت که خواستید می توانید تعریف کنید , چند مقدار از پیش تعریف شده وجود دارد که تعدادی از آن را در کد php بالا به کار بردیم :

  • Jat –  مقدار timestamp ساخت توکن
  • Jti – یک رشته یکتا که میتواند برای اعتبارسنجی توکن استفاده شود
  • Iss – یک رشته که شامل نام یا ID اپلیکیشن است که میتواند نام دامنه هم باشد.
  • Nbf – مقدار timestamp زمانی که توکن معتبر است . که باید مساوی یا بزرگتر از آن باشد .
  • Iat – در اینجا , توکن برای ۱۰ ثانیه معتیر است.
  • Exp – مقدار timestamp زمانی که توکن معتبر است که باید بزرگتر از iat و nbf باشد . در این مورد , توکن بعد از ۶۰ ثانیه معتبر است

استفاده تمام موارد بالا اجباری نیست اما به شما در ادامه به اعتبارسنجی توکن کمک خواهد کرد . payload اپلیکیشن ما زمانی که مقدار userId,username ذخیره میشود در data قرار می گیرد . توجه داشته باشید هنگامی که JWT به هیچ عنوان اطلاعات حساس مثل پسورد ها را در JWT وارد نکنید.

تبدیل این آرایه به یک JWT بسیار ساده است :

JWT::encode() تمام کار ها را انجام می دهد (تبدیل آرایه به داده JSON , تولید هدرها ,ساخت payload و اینکد رشته نهایی). می توانید secret key را طولانی , باینری و اینکد کنید و در فایل config ذخیره کنید . اما ذخیره مستقیم آن در کد ها ایده بدی است !

حالا کلاینت توکن را دارد , می توانید آن را توسط JS یا هر مکانیزمی که دوست دارید ذخیره کنید . یک مثال از آن را با jQuery میبینیم :

 

حالا یک ریسورس که توسط مکانیزم JWT محافظت شده است را بازیابی میکنیم .

احراز هویت توکن در php با JWT

زمانی که بر روی دکمه “Get resource >>” کلیک می کنید , اگر همه چی اوکی باشد , باید یک تصویر را در محیط خاکستری رنگ ببینید .حالا از ajax برای ارسال درخواست به منبع سرویس استفاده می کنیم .

توجه داشته باشید از گزینه beforeSend استفاده کردیم . ما به jQuery می فهمانیم که قبل از ارسال هر درخواستی این تابع را اجرا کن که نیاز داریم با این کار هدر Authorization را با مقدار JWT در فرمت Bearer [JWT] اجرا کنیم .  پس زمانی که بر روی دکمه کلیک میکنیم درخواست زیر ارسال می شود :

حالا می توانیم منبع محافظت شده را ببینیم .

احراز هویت توکن در php با JWT

نحوه اعتبارسنجی توکن در سرویس منبع بصورت زیر است :

من از Zend\Http\PhpEnvironment\Request برای ساده تر کردن کارها هنگام استخراج نوع و هدر درخواست HTTP بهره می برم .

حالا بیایید ببینیم آیا یک رشته JWT در هدر Authorization وجود دارد یا خیر.

یکی از راه های جایگزین که ممکن است به جای استفاده از هدرهای Authorization در درخواست HTTP , پاس دادن آن به عنوان پارامتر URL است :

حالا قصد داریم که JWT را دیکد کنیم . توجه داشته باشید که ما قبلا از Secret Key برای ساختن توکن استفاده کردیم که در این مرحله هم از آن بهره می بریم.

اگر هنگام دیکد کردن JWT به مشکل برخوردیم ممکن است :

  1. طول رشته داده شده با استاندارد ۳ بخشی که قبلا توضیح دادیم یکسان نیست
  2. هدر یا payload یک رشته معتبر JSON نیست .
  3. امضای رمزنگاری صحیح نیست که به این معنا است که داده دستکاری شده است !!
  4. مقدار nbf یا iat که در jwt با timestamp تعریف شده است ازtimestamp فعلی کمتر است .
  5. مقدار exp که همراه JWT ست شده است کمتر از timestamp فعلی کمتر است .

همانطور می بینید , JWT یک کنترل خوب بر روی مقادیر غیرمعتبر دارد بدون آنکه نیاز به ساخت مجدد آن داشته باشد و یا آن را بر اساس لیست توکن های معتبر دارد .

 

در نهایت یک تصویر را از lorempixel.com را درخواست می کنیم , آن را بصورت base64 اینکد و بصورت رشته json در پاسخ ارسال می کنیم .

اگر قصد داشته باشید , می توانید سورس نمونه احراز هویت توکن در php با JWT را  باکس دانلود دریافت و مطابق راهنما پیش برید و دقیق تر کد ها را بررسی کنید .

احراز هویت توکن در php با JWT

جمع بندی

از این به بعد می توانید تلاش کنید که JWT را در REST API های خود استفاده کنید , شاید هم سعی کنید از الگوریتم های دیگری مثل RS256 برای ساخت امضا استفاده کنید و یا حتی این مورد را با احراز هویت OAUTH2 از قبل ساخته شده بر روی سرور ادغام بدید .

امیدوارم از آموزش پیاده سازی احراز هویت توکن در php با JWT لذت برده باشید و در ساخت REST API های خود استفاده کنید.

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

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

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۴۸)

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

  1. امیرحسین ۴ بهمن ۱۴۰۲

    سلام، چطوری میتونم برای لاگین توی سایت php، از توکن‌های سخت افزاری استفاده کنم؟

    پاسخ
    1. حسن شفیعی ۴ بهمن ۱۴۰۲

      سلام. هر سخت افزاری باید ماژول یا کتابخانه برای اتصال به نرم افزارهای جانبی مثل php رو داشته باشه. برای همین داکیومنت اون سخت افزار رو چک کنید

      پاسخ
      1. امیرحسین ۴ بهمن ۱۴۰۲

        ممنون از شما، من سخت‌افزارشم هم ندارم. میخوام چنتایی تهیه کنم و استفاده کنم. ممنون میشم اگر اطلاعاتی دارید بهم لطف کنید.

        پاسخ
      2. حسن شفیعی ۴ بهمن ۱۴۰۲

        متاسفانه تجربه ای در این مورد ندارم. قبل تهیه اول از بین انتخاب ها مدلشو به همراه کلمه کلیدی api php سرچ کنید اگه موجود بود تهیه کنید

        پاسخ
  2. Dude ۷ مهر ۱۴۰۲

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

    پاسخ
    1. حسن شفیعی ۲۳ مهر ۱۴۰۲

      سلام. ممنون
      از طریق کوکی ها انجام میشه. بخش network رو چک کنید

      پاسخ
  3. ناصر ۲۴ شهریور ۱۴۰۲

    سلام مهندس شفیعی وقت بخیر
    ممنون از آموزش مفیدتون
    سوالی که دارم اینه تا چه زمانی این توکن معتبر هست؟
    چطور میشه این توکن رو رفرش کرد؟
    اگه توکن تاریخش بگذره نیاز به ارسال مجدد نام کاربری و کلمه عبور هست؟
    چطور میتونیم برای امنیت بیشتر این توکن رو هر چند وقت یکبار رفرش کنیم و تغییر بدیم بدون اینکه کاربر مجدد نام کاربری و کلمه عبور خودش رو ارسال کنه.
    یا کلا نیازی به تغییر این توکن نیست؟ از لحاظ امنیت مشکلی ایجاد نمیکنه؟

    پاسخ
    1. حسن شفیعی ۲۷ شهریور ۱۴۰۲

      سلام. ممنون خوشحالیم که مفید واقع شده
      زمان اعتبار رو از اینجا میتونید مشخص کنید
      $expire = $notBefore + 60;
      بعد اکسپایر مجدد درخواست لاگین میاد
      نیازی به رفرش مجدد سمت شما نیست همین expire کافی هست

      پاسخ
  4. Dude ۱۶ خرداد ۱۴۰۱

    سلام
    دو تا کتابخانه که گفتید کلا خطا میده .
    composer require zendframework/zend-config:~2.3
    composer require zendframework/zend-http:~2.3
    و به جاش composer require laminas/laminas-http میگه نصب کنید که باز هم خطا میده:
    Package container-interop/container-interop is abandoned, you should avoid using it. Use psr/container instead.
    نمیتونم توکن استخراج و هدر از طریق درخواست HTTPدریافت کنم .
    خطا ==> Wrong number of segments
    ممنون بابت راهنمایی.

    پاسخ
  5. Dude ۱۵ خرداد ۱۴۰۱

    سلام اقای شفیعی.
    من واسه دیکود کردن توکن از روش زیر استفاده میکنم ولی خطا میده. نوع خطا ==> (Wrong number of segments)

    ولی به صورت دستی توکن وارد میکنم انجام میشه مثل کد پایین:

    پاسخ
  6. مهدی ۱ اسفند ۱۴۰۰

    سلام مهندس شفیعی من در مورد ذخیره توکن تو سایتای ایرانی و خارجی گشتم تاکید داشتن از کوکی و از نوع http only استفاده کنیم تا در برابر حمله هکر ها مقاوم باشه و یه سایت ایرانی هم گفته بود چون ممکنه حجمش بالاتر از ۴kb بشه از لوکال استوریج استفاده کنیم
    سوالات
    دیگه به جز اینا سوالی ازتون در این بخش نمی پرسم
    ۱ حالا به طور قطعی از کدوم استفاده کنم کوکی http only یا لوکال استوریج ؟
    ۲ آیا علاوه برا کوکی یا لوکال استوریج در دیتابیس هم ذخیره کنم ؟
    ۳ حالا این توضیح من در مورد نحوه عملکرد درسته یا نه ?
    وقتی کاربر برای اولین بار لاگین میکنه و تایید شد کاربر سایت هست یک توکن می سازیم و در مثلا لوکال استوریج ذخیره میکنیم و اطلاعاتی مثل username رو در توکن ذخیره میکنیم و وقتی توکن رو decode کردیم و مشخص شد username بدست آمده با توکن و اونیکه کاربر وارد کرده یکی هست بهش دسترسی میدیم

    پاسخ
  7. مهدی ۱ اسفند ۱۴۰۰

    سلام مجدد مهندس شفیعی ممنون از راهنمایی تون من توکن رو برای کابر میسازم و در دیتابیس ذخیره میکنم حالا بعد از اینکه کاربری نام کاربری و رمز عبور رو وارد کرد و تایید شد کاربر سایت هست و توکن مربوط به این کاربر هم در فیلد توکن براش ذخیره شده از اینجا به بعد رو تا آخر یه توضیحی بدید که من چیکار کنم ؟
    از سشن و کوکی که دیگه نباید استفاده کنیم برای نگه داشتن کاربر درسته ؟

    پاسخ
    1. حسن شفیعی ۱ اسفند ۱۴۰۰

      سلام.
      بله از این آموزش برای ذخیره این اطلاعات استفاده کنید :
      https://netparadis.com/html-tutorial-27-html5-web-storage/

      این مثال داخل پست کاملا واضح هست از لاگین و ساختن jwt تا گرفتنش از کاربر و نمایش اطلاعات مورد نیاز

      پاسخ
  8. مهدی ۱ اسفند ۱۴۰۰

    سلام مهندس شفیعی وقت بخیر وقتی توکن رو برای کاربر تولید کردیم تو کوکی ذخیره کنیم براش یا تو دیتابیس میشه راهنمایی کنید یه مثال ساده برای لاگین کاربران دارید لینکشو قرار بدید

    پاسخ
    1. حسن شفیعی ۱ اسفند ۱۴۰۰

      سلام ممنون.
      داخل دیتابیس ذخیره کنید
      مثال بسیار ساده برای لاگین کاربران داخل گیت هاب هست :
      https://github.com/techiediaries/php-jwt-authentication-example

      پاسخ
  9. مهدی ۳۰ بهمن ۱۴۰۰

    سلام مهندس شفیعی شما گفتید اگه کاربران زیاد باشن استفاده از سشن برای احراز هویت باعث کندی سرور میشه حالا بالای چند کاربر تعداد زیاد حساب میشه مثلا صد هزار نفر خیلی زیاده ؟
    و اینکه jwt به لحاظ امنیتی از سشن بهتره ؟
    و سوال آخر من برای یه سایت با تقریبا صد هزار نفر کاربر از سشن استفاده کنم ایرادی داره ؟

    پاسخ
    1. حسن شفیعی ۳۰ بهمن ۱۴۰۰

      سلام.
      بله صدهزار کاربر خیلی زیاده.
      بله jwt از لحاظ امنیتی بهتر از سشن هست
      برای این تعداد کاربر اگه از سشن استفاده کنید باید سرور تون هم قوی باشه.
      که خب این موارد باید بصورت realtime بررسی بشه که پیک تعداد کاربران انلاین بخصوص در زمان های جشنواره یا تبلیغات که زیاد میشه باید ببینید که سرورتون از منابع سخت افزاریش چقد استفاده شده ایا سایت/اپلیکیشن کند شده یا نه
      به هر حال اگه میخواید قبل از ایجاد چنین مشکلات بهینه کنید حتما سروری بیش از نیاز سایت/اپ تهیه کنید تا همیشه خیالتون از آپ تایم سرور راحت باشه

      پاسخ
  10. امید امیری ۱۷ بهمن ۱۴۰۰

    سلام
    توکن رو تو سایت https://jwt.io/ کپی میکنم بدون داشتن secretKey اطلاعاتو استخراج میکنه
    چرا اینطوریه؟

    پاسخ
    1. حسن شفیعی ۱۹ بهمن ۱۴۰۰

      سلام.
      خود رشته مهم نیست. اطلاعاتی مثل آیدی و اینا هستند که مهمه و وقتی ارسال میشه به سمت سرور داخل دیتابیس چک میشه

      پاسخ
  11. حسین ۷ بهمن ۱۴۰۰

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

    پاسخ
    1. حسن شفیعی ۷ بهمن ۱۴۰۰

      سلام.
      تمام کارهایی که گفتید رو بهتره با جاواسکریپت و ایجکس انجام بدید
      یعنی با ایجکس یه درخواستی بفرستید ببینید توکن معتبره یا نه اگه معتبر بود با دستور
      window.location.replace(“http://site.com”);
      میتونید ریدایرکت کنید
      اگر هم معتبر نبود که alert بزنید و خطا رو نشون کاربر بدید

      پاسخ
      1. حسین ۷ بهمن ۱۴۰۰

        مشکل اصلی من خط آخر سوالم بود. چطور همراه با ریدایرکت, jwt رو هم ارسال کنیم. اگه امکان داره آیدی تلگرام بدید تا سریع تر در این باره صحبت کنیم.(این مشکل ۴ ماهه پروژه بنده رو به تعلیق انداخته)

        پاسخ
      2. حسن شفیعی ۷ بهمن ۱۴۰۰

        دو راه دیگه هم دارید
        یه فرم بسازید که اینپوت ها مخفی باشه و توش توکن رو قرار بدید و با جاواسکرسپت سابمیت کنید
        راه دوم اینه با curl ارسال کنید که اموزشش‌اینجا هست :
        https://netparadis.com/php-curl

        پاسخ
      3. حسین ۷ بهمن ۱۴۰۰

        راه دوم رو تحقیق کردم ظاهرا امکان پذیر نیست. چون میخوام همراه با ریدایرکت ارسال بشه. یعنی الان صفحه ۱ هستیم و بعد از اینکه اطلاعات ورود رو وارد کردیم و سابمیت رو زدیم همراه با ریدارکیت به صفحه ۲, jwt هم ارسال بشه(از سشن استفاده نمیکنم)

        پاسخ
  12. z ۲ شهریور ۱۴۰۰

    سلام ممنون بابت مطالب مفیدتون. میخواستم بدونم کاربری که لاگین میکنه و بهش توکن میدیم، حالا باید هر درخواستی که کاربر به سرور میفرسته توش توکن رو هم باید باشه درسته؟
    و اینکه در درخواست های post و همچنین get باید در هدرش این توکن رو قرار بدم؟

    پاسخ
    1. حسن شفیعی ۳ شهریور ۱۴۰۰

      سلام ممنون.
      بله درسته

      پاسخ
  13. امیر ۱۶ اردیبهشت ۱۴۰۰

    سلام
    وقتی ما از Secret Key برای رمزنگاری توکن استفاده میکنیم پس چرا یه سری سایت ها میتونن بدون داشتن Secret Key این داده ها رو Decrypt کنن !
    مثلا این سایت : calebb.net
    میشه توضیح بدید که چطور این اتفاق میفته ؟ و اینکه برای برقراری امنیت بیشتر چه روشی پیشنهاد میکنن ؟

    پاسخ
    1. حسن شفیعی ۱۶ اردیبهشت ۱۴۰۰
  14. علی ۲۳ خرداد ۱۳۹۹

    در php خام چطوری استفاده کنیم

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

      از کتابخانه مورد نظر استفاده کنید و نیازی نیست کل فرایند رو از اول بنویسید

      پاسخ
  15. علی ۱۶ شهریور ۱۳۹۸

    خوب چطوری تشخیص میده که توکن معتبر هستش
    ما یک secret key داریم که میاد با اطلاعات دیگه ترکیب میشه و یک tokenبه کاربر ارسال میشه
    حالا ما سمت سرور فقط secret key رو تو config ذخیره کردیم ونه خود token رو
    پس موقع ارسال توسط کاربر سرور چطوری متوجه میشه که خود token معتبر هستش

    پاسخ
    1. حسن شفیعی ۱۶ شهریور ۱۳۹۸

      توابعی که تعریف شدند امکان اعتبارسنجی را به خوبی فراهم کردند. اگر در صحت درستی اعتبارسنجی شک دارید متدهای مربوطه رو بررسی کنید
      https://github.com/firebase/php-jwt/blob/master/src/JWT.php
      موفق باشید.

      پاسخ
  16. مهدی ۲۸ مرداد ۱۳۹۸

    یه چیزی که ذهنمو خیلی درگیر کرده اینه که اگه من مثلا داخل برنامه اندرویدی یک توکن بسازم و این توکنم تا یک هفته معتبر باشه واین توکن لو بره کاربر میتونه از این توکن جایی خارج از برنامه اندروید استفاده کنه؟چون یادمه گفتید agent user رو هم از هدر میگیره وبر این اساس توکن میسازه وهمینطور توکن دریافتی هم چک میکنه که همون agent یا عامل این درخواست داده باشه تا بهش جواب بده.
    الان کدهای داخل این مقاله اسمی از agent توش برده نشده؟به چه صورته

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

      سلام.
      خب به چه صورت لو بره ؟ مگه توکن مدیریت هست که لو بره و امنیت رو زیر سوال بره. توکن کاربر هست و هیچ کس بجز کاربر به این توکن دسترسی نداره. اصلا خود کاربر هم به این توکن دسترسی نداره چون پشت صحنه این اتفاقات میفته
      لو رفتن به دو صورته یا سرور هک بشه که خب اگر هکر این کارو بکنه دیگه چه نیاز به توکن یک کاربر معمولی داره, چون دسترسیش فول هست کل اپ و سایت رو میترکونه دیگه

      موفق باشید.

      پاسخ
  17. بهروز ۱۹ مرداد ۱۳۹۸

    سلام خسته نباشید
    ممنون بابت نوشتن این مقاله خوب، یه سوال دارم اینکه اگه ما نخوایم از فریم ورک یا کد های نوشته شده در کامپوزر استفاده کنیم آیا پیاده سازی JWT با php خام منطقیه؟ یعنی ما خودمون بیایم با توجه به نحوه عملکرد این روش یه اسکریپت خودمون بنویسیم، اگه جواب مثبت هستش چه موارد امنیتی باید رعایت بشه توی این سناریو، ممنون

    پاسخ
    1. حسن شفیعی ۱۹ مرداد ۱۳۹۸

      سلام. ممنون. خوشحالیم که مفید واقع شده.
      زمانی که یک سیستم عالی جوابش رو پس داده نیازی نیست که یک اسکریپت دیگر مشابه آن را بسازیم مگر آنکه قصد رقابت , فروش یا انتشار آن در دنیای اپن سورس را داریم.
      در دنیای برنامه نویسی وب هم استفاده از این ابزار های کارا بهتر از آن است که وقت زیادی رو برای تولید, توسعه و خطایابی هدر بدیم و به اصطلاح چرخ رو از ابتدا اختراع کنیم.
      در حالی که یک ابزار بسیار خوب به این منظور هست که خیلی سریع می توانیم از آن بهره ببریم و زمان باقی رو برای توسعه و بهبود عملکرد بخش های مخنلف برنامه خود صرف کنیم یا حتی این اسکریپت را بنابر نیاز خود کمی شخصی سازی کنیم و در پروژه های بعدی هم از آن بهره ببریم.
      استفاده از این نوع ابزارها برای پیشرفت کار جز اصول حرفه ای در حوزه برنامه نویسی است و به هیچ وجه به این گونه تلقی نمی شود که “بلد نیستیم” بلکه برای زمان و امنیت و کارایی برنامه خود اهمیت قایلیم.
      اگر اصرار به ساخت ابزار شخصی خود را دارید کافیه چندتا کلاس مربوط به کدگذاری/شکستن کد و وریفای و هدر ارسال رو در اسکریپت بررسی کنید(فولدر src فایل JWT.php) و بعد کلاس شخصی خود برای اینکار رو بنویسید (داخل کلاس JWT چند متد پایه که گفته شد وجود دارند)
      موفق باشید.

      پاسخ
  18. مهدی ۲۵ تیر ۱۳۹۸

    سلام چجوری میتونم از composer داخل وب هاستیگ استفاده کنم؟(php)چون اموزشی که مطرح شده برای ویندوز هست و کامپوزرم روی هاست cpanel نمیشه نصب کرد!

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

      سلام.
      یا از ftp استفاده کنید که وصل بشه به ادیتورتون و روی phpstormتون در ویندوز کامپوزر رو اجرا کنید تا تغییراتی که عینا اعمال میشه روی فایل های هاست همزمان ایجاد بشه
      یا اینکه هاستی تهیه کنید که از گیت پشتیبانی کنه و پروژه رو روی گیت لب بارگذاری و به اینصورت از کامپوزر استفاده کنید
      و یا سرور مجازی یا اشتراکی تهیه کنید که بتونید این خدمات خط فرمان و کامپوزر را داشته باشید.

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

      پاسخ
      1. مهدی ۲۶ تیر ۱۳۹۸

        سلامی مجدد، خیلی ممنون بابت پاسختون از همون روش phpstorm استفاده کردم،منتهی چیزی که برام مبهمه اینه من میخوام فقط از داخل اپلیکیشن خودم اون فایل های php یا درواقع rest api شخصی خودم قابل استفاده باشه خب وقتی در ازای یک یوزر پسوردی که با ثبت نام داخل خود اپ میشه دریافت کرد توکنو بده خب قطعا هرکاربری میتونه ثبت نام بکنه و توکنشو بگیره و rest api رو مورد حمله یا استفاده غیرمجاز قرار بده، ایا دراین مورد باید چیکار کرد؟چون امنیت خیلی مهمه واگه بشه مثلا یه سری مقادیرو با استفاده زا این کتابخونه فرستاد سمت سرور به صورت رمزگذاری شده خیلی خوب میشه که کاربر اطلاعات یا params های پست شده رو مبهم ببینه؟واینکه rest api من از فایل های زیادی تشکیل شده وداخل هموشنم یک فایل کانفیگ اینکلود شده و برای جلو گیری از کدنویسی اضافی به نظر شما باید داخل همون فایل کانفیگ توکنو چک کنم و اگه درست نبود exit(); کنم داخل php? و مورد بعدی اینه که خب به هرطریقی توکن دریافت بشه اگه هدر درخواست بو بره باز کاربر میتونه توکنو ببینه …وهیچ تفاوتی با نبودش نمیکنه اینطوری. ببخشید سئوالاتم واقعا زیاد شد درمورد موارد بالا جستجو زیاد کردم ولی پاسخ انچنانی دریافت نکردم،ممنون

        پاسخ
      2. حسن شفیعی ۲۷ تیر ۱۳۹۸

        سلام. برای هر درخواستی که به سمت سرور ارسال میشه در ابتدای کار شما باید چک کنید که توکنی ارسال شده یا خیر. اگر ارسال نشده یا تاریخش گذشته ازش درخواست می کنید که دوباره اطلاعات ورود رو بزنه و توکن جدید براش صادر بشه.
        توکن باید تاریخ انقضا داشته باشه تا تمام این مواردی که گفتید پیش نیاد. مشکل امنیتی وجود نداره. کاربر ادمین که نیست بخواد خراب کاری کنه یا چیزی لو بره.
        این توکن همراه خودش آی پی و agent داره و مثلا کاربر می خواد به چه کسی اینو بده یا چه کاری کنه که بخواد مشکل امنیتی پیش بیاد؟
        در کل از نظر امنیت مشکلی نداره و به همین روش می تونید استفاده کنید.
        چون کدهاتون احتمالا استاندارد خاصی نداره که همه جا فایل کانفیگ رو اینکلود کردید پس بله در همان فایل این مورد رو چک کنید

        پاسخ
  19. محسن ۲۴ فروردین ۱۳۹۸

    سلام
    من می خوام از روش ساخت توکن ساده استفاده کنم. یعنی وقتی کاربر لاگین میشه یک توکن بسازم که در درخواست های بعدی از سمت کلاینت ارسال بشه. من می خوام از این سیستم در یک بازی آنلاین استفاده کنم مثلا برای ثبت رکود یا تعداد سکه های بدست آمده که باید در سرور ذخیره بشه(بصورت GET یا POST). سوال اینه که اگه هکرها لینک ارسال را پیدا کنند که کار سختی هم نیست، می تونند خودشون از طریق مرورگر یا روش دیگه Request بزنن به سرور. چجوری میشه جلو این کار را گرفت؟

    پاسخ
    1. حسن شفیعی ۲۴ فروردین ۱۳۹۸

      سلام. از آی پی هم برای احراز هویت استفاده کنید و هنگام بررسی درخواست مطمین باشید که توکنی که به کلاینت داید با همان آی پی درخواستی یکسان باشد.
      برای اینکار هم باید مقادیر توکن و آی پی رو در یک جا مثلا دیتابیس ذخیره کنید تا در هر ریکويست چک کنید.
      موفق باشیدو

      پاسخ
  20. محمد شجاع ۱۶ آذر ۱۳۹۷

    سلام در مورد تاریخ انقضای jwt ها دنبال یه راه حلی هستم که تو هیچ سایتی نتونستم بهش برسم
    اگر ممکنه راهنماییم کنید ، سوالم اینه وقتی تاریخ انقضای یه توکن رو ۶۰ دقیقه تعیین کنیم و کاربر بعد از یک روز توکن ذخیره شده در سیستم خوشو برامون ارسال کنه چجوری میشه اونو احراز هویت کرد طوری که دیگه به صفحه لاگین هدایت نشه .
    اگر ممکنه روش درست رو معرفی کنید تمام مقالات فقط از نحوه ایجاد توکن در زمان لاگین گفتن و بعد همشون حرفهای تکراری رو بیان کردن که کاملا مشخصه

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

      سلام. وقتی شما یک توکن به همراه تاریخ انقضا برای کاربر تعیین می کنید مطمینا آنرا یک جایی مثل فایل و یا دیتابیس ذخیره می کنید. حالا اگر کاربر بعد از مثلا یک روز مراجعه کرد و درخواستی را برا یک بخش نیازمند احراز هویت (مثل پنل کاربری و بخش سفارشات)ارسال کرد شما می توانید توکنی که همراه درخواست ارسال میشه (توکن منقضی) رو در دیتابیس جستجو کنید و بعد از بررسی صحت درخواست و وجود توکن بدون تغییر, تاریخ انقضای آن را افزایش/تمدید کنید(آپدیت رکورد دیتابیس) و کاربر بدون اینکه متوجه موضوعی بشه صفحه درخواست شده رو مشاهده کنه

      پاسخ
  21. مجید ۳۱ تیر ۱۳۹۷

    سلام عذر میخوام برای مشاهده کد bearerدر تلگرام باید چیکار کنیم

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

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

      پاسخ
  22. قاسم صابری ۲۰ خرداد ۱۳۹۷

    سلام متشکر از مطلب مفیدتون برای استفاده از jwt در فریمورک کدایگنایتر باید به عنوان کتابخانه اضافه کنیم آیا ؟ راهکار استفاده رو اگر برام بفرستین یا لینک مفید قرار دهید ممنون میشم

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

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

      https://github.com/firebase/php-jwt

      دستور : composer require firebase/php-jwt

      composer چیست

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