رموز JWT في JavaScript (Node.js)
\n\nJSON Web Token (JWT) هو معيار مفتوح (RFC 7519) لإنشاء رموز وصول تعتمد على JSON. يُستخدم JWT على نطاق واسع للمصادقة وتبادل المعلومات بين العميل والخادم في تطبيقات الويب الحديثة على Node.js. في هذه المقالة، سنشرح كيفية العمل مع JWT في بيئة Node.js باستخدام المكتبة الشائعة jsonwebtoken.
ما هو JWT؟
\n\nيتكون JWT من ثلاثة أجزاء مفصولة بنقاط:
\n\n- \n
- Header — الرأس، يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256 أو RS256). \n
- Payload — الحمولة، حيث تُخزَّن البيانات (المطالبات): معرف المستخدم، الدور، مدة صلاحية الرمز، إلخ. \n
- Signature — التوقيع، الذي يتم إنشاؤه بناءً على الرأس والحمولة والمفتاح السري. يضمن التوقيع عدم تغيير الرمز. \n
يبدو JWT بصريًا كالتالي: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
تثبيت مكتبة jsonwebtoken
\n\nللعمل مع JWT في Node.js، يُستخدم الحزمة jsonwebtoken. قم بتثبيتها عبر npm:
npm install jsonwebtoken\n\nبعد التثبيت، يمكنك استيراد المكتبة إلى مشروعك:
\n\nconst jwt = require('jsonwebtoken');\n\nإنشاء (توقيع) رمز JWT
\n\nلإنشاء رمز، استخدم الطريقة jwt.sign(). تأخذ ثلاثة معاملات رئيسية:
- \n
- payload — كائن يحتوي على البيانات التي تريد ترميزها في الرمز. \n
- secretOrPrivateKey — المفتاح السري (أو المفتاح الخاص لخوارزميات RSA/ECDSA). \n
- options — كائن يحتوي على خيارات، مثل
expiresInلتحديد مدة صلاحية الرمز. \n
مثال على إنشاء رمز:
\n\nconst 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 دقيقة).
التحقق من رمز JWT
\n\nللتحقق من صحة الرمز، تُستخدم الطريقة jwt.verify(). تُعيد الحمولة المفكوكة إذا كان الرمز صالحًا، أو تُلقي خطأ إذا انتهت صلاحية الرمز أو كان التوقيع غير صحيح.
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في بعض الأحيان، تحتاج فقط إلى قراءة البيانات من الرمز دون التحقق من التوقيع (مثلًا لأغراض التصحيح). لهذا، استخدم jwt.decode():
const jwt = require('jsonwebtoken');\n\nconst token = 'eyJhbGciOiJIUzI1NiIs...';\nconst decoded = jwt.decode(token);\n\nconsole.log('الحمولة دون تحقق:', decoded);\n\nهام: jwt.decode() لا يتحقق من التوقيع، لذا لا تستخدمه للمصادقة في بيئة الإنتاج.
Middleware لـ Express مع JWT
\n\nفي تطبيقات الويب على Express، يُستخدم JWT غالبًا لحماية المسارات. سننشئ middleware بسيطًا يتحقق من الرمز من الرأس <