رموز JWT في JavaScript (Node.js): دليل شامل

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

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

ابدأ الدورة

رموز JWT في JavaScript (Node.js)

\n\n

JSON Web Token (JWT) هو معيار مفتوح (RFC 7519) لإنشاء رموز وصول تعتمد على JSON. يُستخدم JWT على نطاق واسع للمصادقة وتبادل المعلومات بين العميل والخادم في تطبيقات الويب الحديثة على Node.js. في هذه المقالة، سنشرح كيفية العمل مع JWT في بيئة Node.js باستخدام المكتبة الشائعة jsonwebtoken.

\n\n

ما هو JWT؟

\n\n

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

\n\n
    \n
  • Header — الرأس، يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256).
  • \n
  • Payload — الحمولة، حيث تُخزَّن البيانات (المطالبات): معرف المستخدم، الدور، مدة صلاحية الرمز، إلخ.
  • \n
  • Signature — التوقيع، الذي يتم إنشاؤه بناءً على الرأس والحمولة والمفتاح السري. يضمن التوقيع عدم تغيير الرمز.
  • \n
\n\n

يبدو JWT بصريًا كالتالي: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

\n\n

تثبيت مكتبة jsonwebtoken

\n\n

للعمل مع JWT في Node.js، يُستخدم الحزمة jsonwebtoken. قم بتثبيتها عبر npm:

\n\n
npm install jsonwebtoken
\n\n

بعد التثبيت، يمكنك استيراد المكتبة إلى مشروعك:

\n\n
const jwt = require('jsonwebtoken');
\n\n

إنشاء (توقيع) رمز JWT

\n\n

لإنشاء رمز، استخدم الطريقة jwt.sign(). تأخذ ثلاثة معاملات رئيسية:

\n\n
    \n
  • payload — كائن يحتوي على البيانات التي تريد ترميزها في الرمز.
  • \n
  • secretOrPrivateKey — المفتاح السري (أو المفتاح الخاص لخوارزميات RSA/ECDSA).
  • \n
  • options — كائن يحتوي على خيارات، مثل expiresIn لتحديد مدة صلاحية الرمز.
  • \n
\n\n

مثال على إنشاء رمز:

\n\n
const jwt = require('jsonwebtoken');\n\nconst payload = {\n  userId: 12345,\n  role: 'user'\n};\n\nconst secretKey = 'your-secret-key-here';\n\nconst token = jwt.sign(payload, secretKey, { expiresIn: '1h' });\n\nconsole.log('JWT المُنشأ:', token);
\n\n

في هذا المثال، سيكون الرمز صالحًا لمدة ساعة واحدة. يمكنك أيضًا تحديد الوقت بالثواني (expiresIn: 3600) أو بتنسيقات أخرى، مثل '7d' (7 أيام) أو '30m' (30 دقيقة).

\n\n

التحقق من رمز JWT

\n\n

للتحقق من صحة الرمز، تُستخدم الطريقة jwt.verify(). تُعيد الحمولة المفكوكة إذا كان الرمز صالحًا، أو تُلقي خطأ إذا انتهت صلاحية الرمز أو كان التوقيع غير صحيح.

\n\n
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...'; // الرمز الخاص بك\nconst secretKey = 'your-secret-key-here';\n\ntry {\n  const decoded = jwt.verify(token, secretKey);\n  console.log('البيانات المفكوكة:', decoded);\n} catch (err) {\n  console.error('خطأ في التحقق:', err.message);\n}
\n\n

إذا انتهت صلاحية الرمز، ستحصل على خطأ 'jwt expired'. إذا كان التوقيع غير صحيح — 'invalid signature'.

\n\n

فك الترميز دون التحقق من التوقيع

\n\n

في بعض الأحيان، تحتاج فقط إلى قراءة البيانات من الرمز دون التحقق من التوقيع (مثلًا لأغراض التصحيح). لهذا، استخدم jwt.decode():

\n\n
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('الحمولة دون تحقق:', decoded);
\n\n

هام: jwt.decode() لا يتحقق من التوقيع، لذا لا تستخدمه للمصادقة في بيئة الإنتاج.

\n\n

Middleware لـ Express مع JWT

\n\n

في تطبيقات الويب على Express، يُستخدم JWT غالبًا لحماية المسارات. سننشئ middleware بسيطًا يتحقق من الرمز من الرأس <

توصيات