كيف تعمل المصادقة؟
- المستخدم يسجّل بكلمة مرور → نخزّن تجزئتها (لا الكلمة نفسها).
- عند الدخول، نتحقّق من الكلمة ونصدر رمزًا (Token).
- العميل يرسل الرمز مع كل طلب لاحق → نتحقّق منه.
تجزئة كلمة المرور (bcrypt)
// npm install bcrypt
import bcrypt from "bcrypt";
// عند التسجيل
const hashed = await bcrypt.hash(password, 10);
// خزّن hashed في قاعدة البيانات
// عند الدخول
const match = await bcrypt.compare(inputPassword, hashed);
if (!match) {
return res.status(401).json({ error: "بيانات خاطئة" });
}
⚠️ لا تخزّن كلمة المرور كنصّ صريح أبدًا. bcrypt يضيف "ملحًا" تلقائيًّا ويبطّئ الكسر.
رموز JWT
JWT (JSON Web Token) رمز موقّع يحمل بيانات المستخدم، يتحقّق الخادم من توقيعه دون تخزين جلسة:
// npm install jsonwebtoken
import jwt from "jsonwebtoken";
const SECRET = process.env.JWT_SECRET;
// إصدار رمز عند الدخول
const token = jwt.sign({ userId: user.id }, SECRET, {
expiresIn: "1h",
});
res.json({ token });
التحقّق من الرمز (وسيط حماية)
function authenticate(req, res, next) {
const header = req.headers.authorization; // "Bearer <token>"
const token = header && header.split(" ")[1];
if (!token) {
return res.status(401).json({ error: "لا يوجد رمز" });
}
try {
const payload = jwt.verify(token, SECRET);
req.user = payload; // متاح للمعالجات التالية
next();
} catch {
return res.status(403).json({ error: "رمز غير صالح" });
}
}
// حماية مسار
app.get("/profile", authenticate, (req, res) => {
res.json({ userId: req.user.userId });
});
أفضل الممارسات
- خزّن السرّ (
JWT_SECRET) في متغيّرات البيئة لا في الكود. - اجعل للرمز مدّة صلاحية قصيرة (
expiresIn). - استخدم HTTPS دائمًا لمنع اعتراض الرموز.
- لا تضع بيانات حسّاسة داخل JWT (محتواه قابل للقراءة، فقط موقّع).
أخطاء شائعة
- كتابة
JWT_SECRETفي الكود ورفعه إلى Git. - تخزين كلمات المرور بلا تجزئة أو بتجزئة سريعة غير آمنة.
🎯 التالي: ربط Node بقواعد البيانات (MySQL وMongoDB).