JWT یا JSON Web Token چیست؟؟‌( قسمت دوم )

سلام و خوشآمد گویی!‌

سریع بریم سراغ ادامه پست قبلی یعنی JWT چیست‌؛ این قسمت دوم پست هستش و قسمت سوم رو به اجرای این روش احراز هوییت روی NodeJs و ReactJS اختصاص میدیم.

تا اینجای کار با روش های مرسوم احراز هوییت آشنا شدیم. ولی خب سوال پیش میاد که چرا از باید JWT استفاده کنیم؛ در جواب باید بگم که برای احراز هوییت روی API ها ما متاسفانه و خوشبختانه نمیتونیم از دو روش دیگه یعنی Session Cookie استفاده کنیم . توی سیستم SOAP که دیتا ها با فرمت XML رد و بدل میشن؛ ما میتونیم با گرفتن Username, Password تو هر درخواست؛ احراز هوییت رو انجام بدیم.

ولی توی سیستم JWT هم میشه همین کار رو انجام داد ولی یکم دچار پیچیدگی وسردرگمی می شیم ولی خوشبختانه یه مشت گیک نشستن تو آفتاب فکر کردن و رسیدن به فرستادن Username, Password روی هدر درخواست. ولی باز یه مشکلی بود؛‌اگر شما هم به هدر های دیفالت HTTP آشنا باشید؛‌ به فکر هدر Authorization می افتید؛ پس همون گیکا دیدن نمیشه دوتافیلدو توی این هدر فرستاد پس اومدن توکن و اختراع کردن و اونو توی این هدر فرستادن که اتفاقا خیلی کار برنامه نویسا رو ساده کردن.

و اتفاق خوب دوم که احتمالا به یادش افتادید؛‌ استفاده از API ها برای Application .

یعنی فرقی نداره کلاینتمون WebApp, Android, IOS باشه و سیستم احراز هوییتمون به راحتی کار میکنه.




نگاهی دقیق به ساختار JWT

Header

{
  "alg": "HS256",
  "typ": "JWT"
  }

alg: یا همون الگوریتم بهش

typ: یا نوع Token

راجع به الگوریتمای HASH پیشنهاد میکنم این پست رو یه نگاهی بندازید:

AuthcodeTokerhttps://www.thesslstore.com/blog/difference-sha-1-sha-2-sha-256-hash-algorithms/

Payload

{
 "sub": "1234567890",
 "name": "John Doe",
 "iat": 1516239022
  }

sub, Name: مقادیر دلخوای که میخوایم توی توکن بریزیم

iat: که به صورت خودکار تولید میشه(اگه expire Time ست کنید البته ) مخفف Issued At هستش که به صورت UNIX TIME هستش؛ تاریخ تولد توکن رو دخیره میکنه.

Signature

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  SECRETKEY 
)

که معلومه چیکار میکنه؛ Base64 هدر و Payload رو با SecretKey هش میکنه البته طبق الگوریتمی که توی هدر گفتیم.

JWT رو سرور چطوری میخونه ؟؟

وقتی کتابخونه JWT رو به پروژتون اضافه میکنید؛ چند تا متد در اختیارتون میذاره که چندتا از متد های این کتابخونه رو با هم مرور میکنیم:

sign:‌ کارش اینه که Header و Payload و SecretKey و میگیره و JWT میده

verify:‌ توکن و SecretKey رو میگیره و میگه که توکن درست هستش یا نه

decode:‌ خوندن اطلاعات توی توکن

آیا میدونستید حتی کتابخونه JWT برای کلاینت ها هم وجود داره؟؟‌

ولی خب نباید سمت کلاینت احراز هوییت کنیم؛ چون احراز هوییت بی معنی میشه؛ ولی از متد Decode سمت کلاینت میشه برای خوندن اطلاعات توکن استفاده کرد.

منتظر قسمت سوم باشید که توی اون قسمت پیاده سازیJWT رو در NodeJS با کتابخونه PassportJS و هندل کردن درخواست ها در ReactJS خواهیم داشت.