رموز JWT في PHP: مكتبة firebase/php-jwt ودليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

رموز JWT في PHP: دليل شامل لمكتبة firebase/php-jwt



JSON Web Token (JWT) هي طريقة مضغوطة وآمنة لنقل البيانات بين العميل والخادم بتنسيق JSON. في تطوير الويب الحديث، تُستخدم JWT على نطاق واسع لمصادقة المستخدمين وتفويضهم، وكذلك لتبادل المعلومات بين الخدمات المختلفة. في PHP، المكتبة الأكثر شيوعًا وموثوقية للعمل مع JWT هي firebase/php-jwt.



ما هو JWT ولماذا هو مطلوب؟

يتكون JWT من ثلاثة أجزاء مفصولة بنقاط:

  • Header — رأس يحتوي على معلومات حول نوع الرمز وخوارزمية التوقيع.
  • Payload — الحمولة المفيدة مع البيانات (مثل معرف المستخدم، الدور، تاريخ الانتهاء).
  • Signature — التوقيع الذي تم إنشاؤه باستخدام مفتاح سري أو زوج مفاتيح RSA/ECDSA.

المزايا الرئيسية لـ JWT:

  • لا تتطلب تخزين الجلسات على الخادم (عديمة الحالة).
  • يمكن أن تحتوي على أي بيانات بتنسيق JSON.
  • تدعم خوارزميات توقيع مختلفة: HS256، RS256، ES256 وغيرها.
  • مقاومة للتزوير بفضل التوقيع التشفيري.


تثبيت مكتبة firebase/php-jwt

لتثبيت المكتبة، استخدم Composer. افتح الطرفية في المجلد الجذر للمشروع ونفذ الأمر:

composer require firebase/php-jwt

بعد التثبيت، قم بتضمين التحميل التلقائي لـ Composer في سكريبت PHP الخاص بك:

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use Firebase\\JWT\\JWT;use Firebase\\JWT\\Key;?>


إنشاء رمز JWT

لإنشاء رمز، يجب تحديد الحمولة المفيدة (payload) وتوقيعها بمفتاح سري. مثال لإنشاء رمز باستخدام خوارزمية HS256:

<?php$key = 'your-secret-key-here'; // المفتاح السري (32 حرفًا على الأقل)$payload = [    'iss' => 'pythonlib.ru',       // ناشر الرمز    'sub' => '1234567890',         // الموضوع (مثل معرف المستخدم)    'name' => 'إيفان إيفانوف',    'role' => 'user',    'iat' => time(),               // وقت الإنشاء    'exp' => time() + 3600         // تاريخ الانتهاء (ساعة واحدة)];

$jwt = JWT::encode($payload, $key, 'HS256');echo "رمز JWT الذي تم إنشاؤه:" . $jwt;?>

في هذا المثال، نحدد الحقول القياسية: iss (الناشر)، sub (الموضوع)، iat (وقت الإنشاء) و exp (تاريخ الانتهاء). يمكنك إضافة أي حقول مخصصة مثل role أو email.



فك تشفير رمز JWT والتحقق منه

عند استلام الرمز من العميل، يجب التحقق من توقيعه وتاريخ انتهاء صلاحيته. تقوم المكتبة تلقائيًا بالتحقق من الخوارزمية وصحة التوقيع:

<?phptry {    $decoded = JWT::decode($jwt, new Key($key, 'HS256'));    print_r($decoded);} catch (\\Firebase\\JWT\\ExpiredException $e) {    echo "خطأ: الرمز منتهي الصلاحية — " . $e->getMessage();} catch (\\Firebase\\JWT\\SignatureInvalidException $e) {    echo "خطأ: توقيع غير صحيح — " . $e->getMessage();} catch (\\Exception $e) {    echo "خطأ: " . $e->getMessage();}?>

تقوم طريقة decode() بإرجاع كائن stdClass يحتوي على بيانات الحمولة. إذا كان الرمز غير صالح، يتم طرح استثناء مناسب. يُوصى دائمًا بمعالجة استثناءات ExpiredException و SignatureInvalidException.



استخدام التشفير غير المتماثل (RS256)

لزيادة الأمان، استخدم خوارزمية RS256 مع زوج من المفاتيح (خاص/عام). هذا مهم بشكل خاص في بنية الخدمات المصغرة:

<?php// إنشاء المفاتيح (يتم تنفيذه مرة واحدة)// openssl genrsa -out private.pem 2048// openssl rsa -in private.pem -pubout -out public.pem

$privateKey = file_get_contents('

توصيات