JWT چیست آموزش استفاده از آن

JWT چیست آموزش استفاده از آن

JWT چیست آموزش استفاده از آن – کلمه jwt به معنای json web token می باشد که در هر پلتفرمی قابل استفاده است که برای Authorization تایید دسترسی کاربر به منابع مورد استفاده قرار می گیرد .

jwt از پروتکل oauth 2 بهره می برد که یک پروتکل استاندارد محسوب می شود ، یکی از نمونه های بارز آن توییتر است که از این نوع اعتبار سنجی استفاده می کند .

روش های معمولی زیادی برای تایید دسترسی کاربر وجود دارد مثل ذخیره نام کاربری و پسورد به صورت رمزگذاری شده در کوکی .

اما JWT یک راه بهتر و با امنیت بالا می باشد که در عین حال بسیار انعطاف پذیر تر می باشد و در پلتفرم های دیگر مثل android و ios مورد استفاده قرار می گیرد .


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

JWT چیست آموزش استفاده از آن

بخش ساخت توکن


همانطور که در تصویر بالا مشاهده می کنید از 3 بخش تشکیل می شود :

1- Header : این بخش مشخص کننده الگوریتم رمزگذاری است و اطلاعاتی در مورد آن می دهد
2- Payload : داده هایی که می خواهیم ذخیره کنیم و بعدا از آن استفاده کنیم ، مثل نام کاربری و ایمیل
3- Signature : این بخش از ادغام بخش 1 و 2 به صورت رمزگذاری base64 است و secret key است .
در واقع secret key باید یک رمز پیچیده باشد تا باعث بالا رفتن امنیت رمزنگاری شود .

این خیلی مهم است که secret key در اختیار افراد غیر قابل اعتماد قرار نگیرد در صورتی که قرار گیرد احتمال پیدا کردن توکن بدون نیاز به دسترسی وبسایت بالا رفته و امنیت پایین می آید .

در پایان با استفاده از تابع hash_hmac رمزنگاری را انجام می دهیم . اکنون توکنی دریافت می کنیم شبیه به :

eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6IjEyMzQ1Njc4OTAiLCJ1c2VybmFtZSI6ImFybWFuMDEifQ.qsLOFsFLyM__b6biNKkwMBJpNxhnQuD23vDyKMBeXvbMNx9otLrbHPySp8Nsvnpu

این توکن به این شکل رمزگذاری شده :

Header . Payload . Signature


تایید توکن ساخت شده JWT

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

اکنون بخش اول توکن بالا یعنی header را بخواهیم با تابع base64_decode به رشته معمولی برگردانیم به این شکل می شود :

echo base64_decode("eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9"); // {"alg":"HS384","typ":"JWT"}


همچنین بخش 2 یعنی payload :

echo base64_decode("eyJlbWFpbCI6IjEyMzQ1Njc4OTAiLCJ1c2VybmFtZSI6ImFybWFuMDEifQ");// {"email":"1234567890","username":"arman01"}


پس سرور می آید توکن فرستاده شده کاربر را به طور موقت در متغیر ذخیره می کند تا بررسی کند که آیا معتبر هست یا خیر . بنابراین با 2 تکه ای که بدست آمده و secret key رمزگذاری می کند تا ببیند که آیا این توکنی که کاربر فرستاده با توکن خود همخوانی دارد یا خیر .

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

Signature verification failed

می دهد .

ساخت و تایید jwt به صورت عملی

ساخت jwt

برای شروع کار ابتدا کتابخانه مخصوص PHP را با composer به پروژه خود اضافه نمایید :

composer require firebase/php-jwt

اکنون کد زیر را اضافه کنید ( توضیحات در پایین کد ) :

require_once "vendor/autoload.php";

use \Firebase\JWT\JWT;

$secret_key = "ELITE_CODERS_SECRET_KEY";

$day = 1;
$current_time_base_second = time();
$nbf = $current_time_base_second + 5;
$exp = $current_time_base_second + 86400 * $day;

$payload = array(
	"iss" => "https://rapidcode.ir",
	"aud" => "http://rapidcode.io",
	"iat" => $current_time_base_second, 
	"nbf" => $nbf, 
	"exp" => $exp,
	"data" => array( 
		"email" => "info@rapidcode.ir",
		"exp_time" => $exp,
		"readable_time" => date("Y/m/d H:i:s" , $exp)
	)
);

try{
	$jwt = JWT::encode($payload , $secret_key , "HS384");

	echo $jwt;

}catch(Exception $e){
	echo $e->getMessage();
}

لاین 5 : رمز مخفی یا secret key تاکید می شود که نباید در اختیار هر کسی قرار گیرد . یک رمز پیچیده برای این بخش در نظر بگیرید .

لاین 13 : این که توکن را چه وبسایتی ساخته و تایید می کند
لاین 14 : در صورتی که چندین دامنه مرتبط با یکدیگر داشته باشیم و بخواهیم برای دامنه rapidcode.io از دامنه rapidcode.ir استفاده کنیم
لاین 15 : زمان ساخت توکن بر اساس timestamp
لاین 16 : اینکه پس از ساخت تا چه مدت بعد توکن قابل استفاده نباشد .
لاین 17 : توکن تا چه زمانی معتبر باشد از آنجایی که در لاین 9 برای 1 روز تنظیم کردیم .
لاین 18 : داده هایی که متناسب با پروژه مان استفاده می کنیم مثلا ایمیل یا نام کاربری ، همچنین چند داده اضافی هم می توانیم داشته باشیم که اختیاری است .


لاین 26 : با تابع encode که متعلق به کلاس JWT است توکن را می سازیم این تابع دارای 3 ورودی است :

1- payload : داده هایی که مرتبط با کاربر است و بعدا مورد استفاده مان قرار می گیرید
2- secret key : رمز مخفی برای جلوگیری از پیداکردن الگوریتم ساخت توکن
3- الگوریتم رمزنگاری : پیشفرض HS256 است اما می تواند فرق داشته باشد ( اختیاری )

تایید و رمزگشایی توکن JWT

تابع JWT::decode دو کاربرد داره که هم تایید می کند که توکن معتبر است و هم داده را از توکن بیرون می کشد و به ما برمی گرداند .

این تابع دارای 3 ورودی ( اجباری ) است :

1- token : همان توکنی که کاربر در هر بار استفاده از منابع به سرور می فرستد
2- secret key : همان رمز مخفی که هنگام ساخت توکن از آن استفاده کردیم
3- الگوریتم رمزنگاری : در صورتی که ورودی دوم JWT::encode را وارد نکردید HS256 بدهید در صورتی که الگوریتم دیگری مثل HS384 داده اید همان را وارد کنید .

دقت داشته باشید که ورودی سوم تابع باید در داخل یک array باشد

require_once "vendor/autoload.php";

use \Firebase\JWT\JWT;

$secret_key = "ELITE_CODERS_SECRET_KEY";

try {
	$jwt = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzM4NCJ9.eyJpc3MiOiJodHRwOlwvXC9yYXBpZGNvZGUuaXIiLCJhdWQiOiJodHRwOlwvXC9yYXBpZGNvZGUuaXIiLCJpYXQiOjE1ODUzMTgwMDgsIm5iZiI6MTU4NTMxODAxMywiZXhwIjoxNTg1NDA0NDA4LCJkYXRhIjp7ImVtYWlsIjoiaW5mb0ByYXBpZGNvZGUuaXIiLCJleHBfdGltZSI6MTU4NTQwNDQwOCwicmVhZGFibGVfdGltZSI6IjIwMjBcLzAzXC8yOCAxNDowNjo0OCJ9fQ.eQezek-pOu2_LxTv046R9qGxlLJIfvWxJ92CFOSOqqop_SAMD4QuCicGNeEQTvS6";

	$json_data = JWT::decode($jwt, $secret_key, array("HS384"));
	$json_data = (array) $json_data;
	$json_data['data'] = (array) $json_data['data'];

	echo "{$json_data['data']['email']} \n{$json_data['data']['readable_time']}";

	/*
		info@rapidcode.ir
		2020/03/28 14:06:48
	*/

} catch (Exception $e) {
	echo $e->getMessage(); 
}

لاین 11 و 12 : اجباری به تبدیل Object به آرایه نیست اما در صورتی که می خواهید به جای آبجکت آرایه داشته باشید می توانید از این روش استفاده کنید .

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


تست و خطای jwt

برای اینکه مطمئن شویم برنامه به درستی کار می کند به صورت دستی تغییری در توکن بدهید مثلا چند کاراکتر به توکن اضافه کنید .

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

Signature verification failed

دانلود سورس JWT چیست آموزش استفاده از آن

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

contact us