المقدمة

ال Authorization و ال Authentication هما مفهومان أساسيان في الأمان الخاص بالمواقع.   بيقوموا بالتأكد إن كل مستخدم له الحق إنه يعمل أي عملية في الموقع و بتحمي باقي ال resources إنه يتم الوصول إليها من أشخاص ملهمش الحق انهم يدخلوا عليها.

النهاردة هنتعلم ايه هو ال authentication و ال authorization ، ازاى نطبق عملي في تطبيق Node js ، الـ best practices وايه هي أشهر المكتبات.


قبل الشرح

تأكد انك منزل Node js عندك علي ال system بتاعك ، لو مش منزلها ممكن تنزلها من المصدر الرسمي بتاعها وهو Node js 


ما هو الـ Authentication ؟

هو عملية التأكد من صحة المستخدم اللي بيخش عندنا ال system ، المستخدم بيحاول يخش عندنا ال system فبيزعم أنه شخص معين فهو عليه انه يثبت لنا انه الشخص ده ، وده عملية بتتم عن طريق انه يدخل ال username وال passwords بتاعه مثلا او مجموعة اخري من ال credentials.


الـ Authentication Best Practices   

  1. دايما اعمل encryption لأي باسوورد داخل عندك ال system بعض المكتبات ممكن تساعدك في كده زي bcrypt .
  2. استخدم دائما ال Https اثناء نقل البيانات من الـ server الي ال client .
  3. استخدم ال sessions و حاول دائما انها تكون متأمنه كويس و معموله بشكل random .

أشهر مكتبات الـ Authentication in NodeJS 

PassportJS

هي واحدة من أشهر مكتبات ال authentication في node js وتدعم اغلب ان لم يكن كل عمليات ال authentication داخل التطبيق ، بتدعم ال authentication ال local زي انك تستخدم (username , password ) ، بتدعم انك تستخدم OAuth ، وال OpenID .

ده طريقة استخدام المكتبة داخل ال server.

const passport = require("passport");
const LocalStrategy = require("passport-local").Strategy;

passport.use(
  new LocalStrategy((username, password, done) => {
    // اسم المستخدم "user" وكلمة المرور "password"
    if (username === "user" && password === "password") {
      return done(null, { id: 1, username: "user" });
    } else {
      return done(null, false, { message: "Invalid credentials" });
    }
  })
);

ما هو الـ Authorization  ؟

هو تحديد العمليات المسموح للمستخدم القيام بها ، تتضمن فتح بعض ال resources و اغلاق الآخرين على حسب العمليات المسموحة لكل مستخدم .

تختلف عن الـ Authentication في أن ال Authentication بيقوم بالتأكد من أن المستخدم بالفعل يحاول الدخول للتطبيق او لا ، ولكن ال Authorization بتتأكد هل المستخدم ده له السماحية انه يدخل علي ال route ده مثلا ام لا.


الـ Authorization Best Practices 

  1. الوصول بناء علي الدور او ما يعرف ب RBAC: يتم تحديد نوع ال user وبناء على نوعه يتم تحديد ال resources اللي يقدر يخش عليها .
  2. عن طريق ال middleware: قبل ما نخش علي route معين بنفذ middleware معين عن طريقة نتأكد هل المستخدم له الحق بالدخول علي ال resource ده ولا لا 
  3. عن طريق ال access token: كل request بيعمله المستخدم سنقوم بالتأكد من ال access token.

أشهر مكتبات الـ Authorization in NodeJS 

Json Web Token (JWT)

المكتبة تعد الأشهر في الـ node js لسهولة التعامل معها وهي بتوفر مجموعة من ال function للتأكد من الصلاحيات المتوفرة لكل مستخدم. 

يمكن ايضا استخدام مكتبة JWT في عمليات ال authentication.

هذة المكتبة تقوم بتكوين token عند عملية ال login او ال register و عند كل عملية تحتاج الي معرفة المستخدم نقوم بالتأكد من ال headers المرسلة مع ال request ونقوم باستخراج ال token ونقارنه بال token الذي قمنا بإنشائه للمستخدم اول مره.

// Generate JWT token
const token = jwt.sign(
  { userId: user._id },
  process.env.JWT_SECRET,
  { expiresIn: '24h' }
);
exports.authenticateToken = async (req, res, next) => {
  try {
    const authHeader = req.headers.authorization;
    const token = authHeader && authHeader.split(' ')[1];

    if (!token) {
      return res.status(401).json({ message: 'Authentication token required' });
    }

    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    const user = await User.findById(decoded.userId);

    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }

    req.user = user;
    next();
  } catch (error) {
    res.status(401).json({ message: 'Invalid token' });
  }
};

في المثال السابق قمنا بعمل middleware للتأكد من المستخدم قبل عمل اي request يتطلب التأكد من بيانات المستخدم .


في الختام

ال Authorization وال Authentication هما عمليتان أساسيتان في توفير الامن لتطبيقات ال Node js وعن طريق اتباع ال best practices و استخدام المكتبات المعروفه والقوية مثل JWT وال passport js يمكنك عمل تطبيقات قوية جدا بال node js و اكثر امانا.

في النهاية اهتم بال security updates واخر الاخبار الخاصة بالأمان في المواقع خصوصا لو انت backend علشان دورك أساسي ومهم في توفير الأمان للتطبيق.