التفويض والمصادقة في Node.js: JWT، Passport.js، bcrypt

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

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

ابدأ الدورة

التفويض والمصادقة في Node.js: دليل شامل



في تطوير الويب الحديث، أمان بيانات المستخدم هو الأولوية القصوى. في هذا الدليل، سنشرح الأدوات والمكتبات الرئيسية لتنفيذ المصادقة (التحقق من هوية المستخدم) والتفويض (التحقق من صلاحيات الوصول) في تطبيقات Node.js. ستتعلم كيفية إعداد حماية المسارات، وتجزئة كلمات المرور، والعمل مع رموز الوصول.



1. المفاهيم الأساسية

  • المصادقة — عملية التحقق من أن المستخدم هو من يدّعي (عادةً من خلال اسم المستخدم وكلمة المرور).
  • التفويض — تحديد الموارد والإجراءات المتاحة للمستخدم المُصادق عليه.
  • JWT (JSON Web Token) — طريقة مضغوطة ومكتفية ذاتياً لنقل البيانات على شكل كائن JSON. يُستخدم لإنشاء رموز الوصول.
  • الجلسات — طريقة تقليدية لتخزين بيانات المستخدم على الخادم (عادةً باستخدام express-session).


2. المكتبات الرئيسية لـ Node.js



2.1. bcrypt — تجزئة كلمات المرور

لا تقم أبداً بتخزين كلمات المرور كنص عادي. bcrypt هي مكتبة للتجزئة الآمنة باستخدام الملح (salt).

const bcrypt = require('bcrypt');const saltRounds = 10;

// تجزئة كلمة المرورasync function hashPassword(password) { const salt = await bcrypt.genSalt(saltRounds); const hash = await bcrypt.hash(password, salt); return hash;}

// التحقق من كلمة المرورasync function checkPassword(password, hash) { const match = await bcrypt.compare(password, hash); return match; // true أو false}


2.2. jsonwebtoken — العمل مع JWT

مكتبة jsonwebtoken تسمح بإنشاء والتحقق من رموز JWT. تتكون الرموز عادةً من رأس (header) وحمولة (payload) وتوقيع (signature).

const jwt = require('jsonwebtoken');const secretKey = 'مفتاحك-السري';

// إنشاء رمزfunction generateToken(userId, role) { const payload = { userId, role }; const token = jwt.sign(payload, secretKey, { expiresIn: '1h' }); return token;}

// التحقق من الرمز (middleware)function verifyToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN if (!token) return res.status(401).json({ error: 'الرمز غير مقدم' });

jwt.verify(token, secretKey, (err, decoded) => { if (err) return res.status(403).json({ error: 'رمز غير صالح' }); req.user = decoded; next(); });}


2.3. Passport.js — مصادقة شاملة

Passport.js هو middleware لتطبيق Express، يدعم أكثر من 500 استراتيجية (محلية، OAuth، JWT، Google، Facebook وغيرها). مثال على الاستراتيجية المحلية:

const passport = require('passport');const LocalStrategy = require('passport-local').Strategy;const User = require('./models/User');

passport.use(new LocalStrategy( async (username, password, done) => { try { const user = await User.findOne({ username }); if (!user) return done(null, false, { message: 'المستخدم غير موجود' }); const isValid = await bcrypt.compare(password, user.password); if (!isValid) return done(null, false, { message: 'كلمة مرور غير صحيحة' }); return done(null, user); } catch (err) { return done(err); } }));

// التسلسل وإلغاء التسلسل (للجلسات)passport.serializeUser((user, done) => done(null, user.id));passport.deserializeUser(async (id, done) => { const user = await User.findById(id); done(null, user);});


3. مثال كامل: التسجيل وتسجيل الدخول

لنجمع كل شيء معاً في تطبيق Express بسيط.



const express =                    

توصيات