# ساخت توکن ارتباطی JWT

JWT در واقع یک توکن امنیتی است که بر پایه فرمت JSON ساخته شده است. این توکن حاوی اطلاعات ضروری کاربر مانند شناسه کاربری، نقش‌ها و سطح دسترسی اوست. جی دبلیو تی به سه بخش سربرگ (Header)، بار (Payload) و امضا (Signature) تقسیم می‌شود. سربرگ شامل الگوریتم امضا و نوع توکن است. بار، اطلاعات کاربر را به صورت JSON در خود جای داده و امضا تضمین‌کننده صحت و درستی اطلاعات است.

### JWT چگونه کار میکند؟

فرآیند کار JWT به شرح زیر است:

#### درخواست ورود

کاربر با وارد کردن نام کاربری و رمز عبور خود در مرحله قبل اقدام به دریافت توکن نموده است. و هسته مرکزی با توجه به اطلاعات اراسلی و دسترسی های مجاز کاربر اثدام به تولید توکن میکند.

#### تولید توکن JWT توسط درخواست کننده

درخواست کننده باید در این مرحله با توجه به اطلاعات زیر توکن JWT خود را ایجاد نموده و بعنوان کلید دسترسی جهت ارتباط با هسته مرکزی در HEADER درخواست های خود آن را ارسال نماید.

#### اعتبارسنجی توکن JWT

<div class="wp-block-image" id="bkmrk-"><figure class="aligncenter size-full">![](https://airplus.app/wp-content/uploads/2025/01/1679512575354-768x319.png-1.webp)</figure></div>در درخواست‌های بعدی، سرور توکن JWT را دریافت کرده و اعتبار آن را بررسی می‌کند. در صورتیکه توکن معتبر باشد، به کاربر اجازه دسترسی به منابع داده می‌شود.

در حال حاضر اعتبار توکن های JWT بمدت 7 روز می باشد. که البته این موضوع بسته به توکن تولید شده در مرحله اول هم دارد در صورتی که توکن تولید شده در مرحله اول اعتباری کمتر از 7 روز داشته باشد انقضأ توکن JWT به همان میزان در نظر گرفته خواهد شد.

##### ساختار JSON Web Token چگونه است؟

ساختار JWT به سه بخش تقسیم می‌شود که با . (dot) از هم جدا می‌شوند:

- Header
- Payload
- Signature

و ساختاری شبیه به xxxxx.yyyyy.zzzzz

##### Header چیست؟

Header از دو بخش تشکیل شده است که بخش اول الگوریتم آن را تعیین می‌کند و بخش دوم نوع آن را مشخص می‌کند، که طبیعتاََ JWT است.

این ساختار JSON با Base64Url رمز گذاری شده است تا به بخش اول آن شکل بدهد، منظور از بخش اول xxxxx.yyyyy.zzzzz است.

برای مثال:

<div class="wp-block-group" id="bkmrk-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D9%86%D9%88%D8%B9-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-%D9%85%D9%82%D8%A7%D8%AF"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table is-style-stripes"><table border="1" class="has-fixed-layout align-center" style="border-collapse: collapse;"><tbody><tr><td class="has-text-align-left" data-align="left">**عنوان**</td><td>**نوع**</td><td>**وضعیت**</td><td>**مقادیر**</td><td>**توضیحات**</td></tr><tr><td class="has-text-align-left" data-align="left">alg</td><td>String</td><td>اجباری</td><td>HS256</td><td>الگوریتم ارسال درخواست</td></tr><tr><td class="has-text-align-left" data-align="left">typ</td><td>String</td><td>اجباری</td><td>JWT</td><td>نوع درخواست</td></tr></tbody></table>

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

##### Payload چیست؟

بخش دوم xxxxx.yyyyy.zzzzz) Token) را Payload تشکیل می‌دهد و شامل یک سری اطلاعات درباره‌ی کاربر و یک سری داده‌های اضافی‌اند، که استفاده از آن‌ها خیلی رایج است. Payloadها می‌توانند ساختاری شبیه به زیر داشته باشند.

<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table is-style-stripes"><table border="1" class="has-fixed-layout align-center" style="border-collapse: collapse;"><tbody><tr><td class="has-text-align-left" data-align="left">**عنوان**</td><td>**نوع**</td><td>**وضعیت**</td><td>**مقادیر**</td><td>**توضیحات**</td></tr><tr><td class="has-text-align-left" data-align="left">iss</td><td>String</td><td>اجباری</td><td> </td><td>دامنه ثبت شده در هسته مرکزی</td></tr><tr><td class="has-text-align-left" data-align="left">aud</td><td>String</td><td>اجباری</td><td>api</td><td>مخاطب شما که در مواردی که شما فقط استفاده کننده از API هستید برابر api باید باشد</td></tr><tr><td class="has-text-align-left" data-align="left">iat</td><td>Timestamp</td><td>اجباری</td><td> </td><td>زمان صدور توکن JWT</td></tr><tr><td class="has-text-align-left" data-align="left">uuid</td><td>Integer</td><td>اجباری</td><td> </td><td>سریال عددی درخواست کننده</td></tr><tr><td class="has-text-align-left" data-align="left">uip</td><td>IP</td><td>اجباری</td><td> </td><td>آدرس IP درخواست کننده</td></tr></tbody></table>

```
{
    "iss": "Your domain",
    "aud": "Your level",
    "iat": "Timestamp",
    "uuid": "Your ID",
    "uip": "Your IP"
}
```

##### Signature چیست؟

آخرین و مهم‌ترین بخش JWTها Signature است، در حقیقت Signature تایید می‌کند که آیا داده‌ای که از سمت کاربر برگشته است بهم ریخته و یا دستکاری شده است؟

الگوریتمی که ما برای رمزنگاری در Header داده‌ایم را می‌گیرد، header و Payload را ترکیب می‌کند و آن‌ها را دوباره رمزنگاری می‌کند و بار دیگر با کلیدی که به Signature داده ایم رمزنگاری می‌کند و اگر کسی مقدار رمزگذاری شده را تغییر دهد خطایی دریافت می‌کنیم که به ما نشان می‌دهد Signature معتبر نمی‌باشد.

Signatureها نیز ساختاری شبیه به زیر دارند.

<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"><figure class="wp-block-table is-style-stripes"><table border="1" class="has-fixed-layout align-center" style="border-collapse: collapse;"><tbody><tr><td class="has-text-align-left" data-align="left">**عنوان**</td><td>**نوع**</td><td>**وضعیت**</td><td>**مقادیر**</td><td>**توضیحات**</td></tr><tr><td class="has-text-align-left" data-align="left">Header</td><td>base64UrlEncode</td><td>اجباری</td><td> </td><td>JSON هدر اینکد شده</td></tr><tr><td class="has-text-align-left" data-align="left">Payload</td><td>base64UrlEncode</td><td>اجباری</td><td> </td><td>JSON اطلاعات ارسالی اینکد شده</td></tr><tr><td class="has-text-align-left" data-align="left">Signature</td><td>String</td><td>اجباری</td><td> </td><td>توکن دریافتی از اتوماسیون</td></tr></tbody></table>

```
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),token)
```

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

</figure></div></div></figure></div></div></figure></div></div>