مقدمة في OAuth 2.0 و JWT: ما هما ولماذا نحتاجهما؟
\nتطبيقات الويب الحديثة نادرًا ما تستغني عن نظام التفويض. سواء كان تسجيل الدخول عبر Google، أو الوصول إلى API، أو حماية المسارات في تطبيق Node.js الخاص بك — ستحتاج إلى OAuth 2.0 و JWT (JSON Web Tokens). أصبحت هذه التقنيات المعيار الفعلي للتبادل الآمن للبيانات بين العميل والخادم.
\nفي هذه المقالة، سنشرح كيفية عمل OAuth 2.0 و JWT، وسنكتب نظام تفويض بسيط باستخدام JavaScript (Node.js). المادة موجهة للمطورين المبتدئين، لذلك سننتقل من النظرية إلى التطبيق مع أمثلة كود مفصلة.
\n\nالجزء 1: ما هو OAuth 2.0 وكيف يعمل؟
\nOAuth 2.0 هو بروتوكول تفويض يسمح للتطبيقات بالحصول على وصول محدود إلى موارد المستخدم دون نقل كلمة المرور. تخيل أنك تريد تسجيل الدخول إلى موقع عبر حساب Google الخاص بك. OAuth 2.0 هو المسؤول عن هذه العملية.
\nالأدوار الرئيسية في OAuth 2.0
\n- \n
- Resource Owner — المستخدم، مالك البيانات. \n
- Client — تطبيقك (مثل خادم Node.js). \n
- Authorization Server — الخادم الذي يصدر الرموز (مثل Google، GitHub). \n
- Resource Server — الخادم الذي يخزن بيانات المستخدم. \n
التدفق النموذجي لـ OAuth 2.0 (منح رمز التفويض)
\n- \n
- يضغط المستخدم على "تسجيل الدخول عبر Google". \n
- يقوم التطبيق بتوجيهه إلى خادم التفويض من Google. \n
- يعطي المستخدم الموافقة. \n
- يعيد Google
authorization codeإلى خادم التطبيق. \n - يستبدل الخادم هذا الرمز بـ
access token. \n - يستخدم الخادم access token للوصول إلى بيانات المستخدم. \n
عمليًا، بالنسبة للتطبيقات البسيطة، غالبًا ما يُستخدم JWT كتنسيق لرمز الوصول.
\n\nالجزء 2: JWT — الهيكل ومبدأ العمل
\nJWT (JSON Web Token) هو طريقة مضغوطة ومكتفية ذاتيًا لنقل المعلومات بين الأطراف على شكل كائن JSON. يتم توقيع الرمز، لذلك يمكن التحقق منه دون الرجوع إلى قاعدة البيانات.
\nهيكل JWT
\nيتكون JWT من ثلاثة أجزاء، مفصولة بنقاط (.):
header.payload.signature\n- \n
- Header — يحتوي على نوع الرمز وخوارزمية التوقيع (مثل HS256). \n
- Payload — البيانات (المطالبات)، مثل معرف المستخدم، الدور، وقت الصلاحية. \n
- Signature — التوقيع، الذي تم إنشاؤه باستخدام مفتاح سري. \n
مثال على JWT مفكوك الترميز
\n{\n "alg": "HS256",\n "typ": "JWT"\n}\n.\n{\n "sub": "1234567890",\n "name": "John Doe",\n "iat": 1516239022,\n "exp": 1516242622\n}\n.\n[signature]\nهام: payload غير مشفر، فقط موقع. لا تقم أبدًا بتخزين بيانات سرية (كلمات المرور) في JWT!
\n\nالجزء 3: تنفيذ تفويض JWT في Node.js
\nالآن ننتقل إلى التطبيق العملي. سننشئ REST API بسيطًا باستخدام Express.js مع تفويض JWT. لهذا سنحتاج إلى المكتبات jsonwebtoken و bcryptjs.
الخطوة 1: تثبيت التبعيات
\nnpm init -y\nnpm install express jsonwebtoken bcryptjs dotenv\nnpm install --save-dev nodemon\nالخطوة 2: الإعداد الأساسي للخادم
\n// server.js\nrequire('dotenv').config();\nconst express = require('express');\nconst jwt = require('jsonwebtoken');\nconst bcrypt = require('bcryptjs');\n\nconst app = express();\napp.use(express.json());\n\nconst users = []; // في مشروع حقيقي — قاعدة بيانات\n\nconst PORT = process.env.PORT || 3000;\nconst JWT_SECRET = process.env.JWT_SECRET || 'mysecretkey123';\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});