إذا كنت ترغب في حماية المحتوى الحساس في تطبيق Node الخاص بك ، فأنت بحاجة إلى طريقة لمصادقة المستخدمين. ومع ذلك ، فإن بناء نظام المصادقة الخاص بك أمر معقد ، ويستغرق وقتًا طويلاً ، وإذا لم يتم بشكل صحيح يمكن أن يؤدي إلى ثغرات أمنية في تطبيقك. أدوات الطرف الثالث مثل Passport تجعل المصادقة أسهل.

في هذا البرنامج التعليمي ، ستتعلم كيفية تنفيذ المصادقة في Node باستخدام Passport و MongoDB.

ما هي المصادقة والترخيص؟

بينما يتم استخدام المصادقة والترخيص أحيانًا بالتبادل ، فإن هذين المفهومين للأمان لهما معاني مختلفة. المصادقة هي عملية التحقق من أن المستخدم هو الشخص الذي يدعي أنه هو بينما التفويض هو عملية تحديد ما إذا كان المستخدم المعتمد لديه حق الوصول إلى أجزاء معينة من التطبيق الخاص بك.

ما هو Passport.js؟

Passport.js (أو Passport) هو برنامج وسيط للمصادقة لـ NodeJS يوفر أكثر من 500 إستراتيجية لمصادقة المستخدمين بما في ذلك جواز السفر المحلي الذي يستخدم اسم مستخدم وكلمة مرور.

يستخدم هذا البرنامج التعليمي جواز السفر المحلي و جواز السفر JWT لتأمين الطرق.

كيفية إعداد مصادقة المستخدم في NodeJS

الآن أنت تعرف القليل عن مصادقة المستخدم و Passport.js ، يمكننا النظر في كيفية إعداد المصادقة على NodeJS. أدناه ، حددنا الخطوات التي ستحتاج إلى اتخاذها.

instagram viewer

الخطوة 1: قم بإعداد خادم العقدة

قم بإنشاء مجلد باسم المستخدم المصادقة nodejs وانتقل إليه باستخدام جهازك الطرفي.

mkdir المستخدم المصادقة nodejs. 

القرص المضغوط المستخدم - المصادقة - nodejs

التهيئة التالية package.json.

الحرف الأول npm

بما أنك سوف تستخدم يعبر، إطار عمل NodeJS الخلفي ، قم بتثبيته عن طريق تشغيل الأمر التالي.

أنا صريح

الآن قم بإنشاء ملف ، app.js، وأضف الكود التالي لإنشاء الخادم.

const صريحة = تتطلب ("صريحة") ؛
تطبيق const = express () ؛
ميناء كونست = 3000 ؛
app.listen (PORT، () => {
console.log (`الاستماع على المنفذ $ {PORT}`) ؛
});

متعلق ب: تعرف على كيفية تثبيت Npm و Node.js على Ubuntu

الخطوة 2: إعداد قاعدة البيانات

أنت بحاجة إلى قاعدة بيانات لتخزين بيانات المستخدم. ستستخدم النمس لإنشاء مخطط بيانات MongoDB يحدد هيكل ونوع البيانات التي ستخزنها في قاعدة البيانات. نظرًا لأنك تقوم بتخزين بيانات المستخدم ، قم بإنشاء مخطط مستخدم.

تثبيت النمس.

npm أنا النمس

قم بإنشاء ملف جديد ، userModel.js، وأضف ما يلي.

const mongoose = تتطلب ('mongoose')
const {مخطط} = النمس
const UserSchema = مخطط جديد ({
البريد الإلكتروني: {
اكتب: سلسلة ،
مطلوب: صحيح
},
كلمه السر: {
اكتب: سلسلة ،
مطلوب: صحيح
}
})
const UserModel = mongoose.model ('المستخدم' ، UserSchema) ؛
module.exports = UserModel ؛

متعلق ب: كيفية إنشاء قاعدة بيانات ومجموعة في MongoDB

قبل تخزين كلمة المرور ، تحتاج إلى تشفيرها لأغراض أمنية. ستستخدم bcryptjs، حزمة npm مفيدة للغاية تجعل العمل باستخدام كلمات المرور المشفرة أمرًا سهلاً.

ثبت bcryptjs.

npm أنا bcryptjs

تعديل usermodel.js لتشفير كلمة المرور قبل حفظها في قاعدة البيانات.

const mongoose = تتطلب ('mongoose')
const bcrypt = تتطلب ('bcryptjs') ؛
const {مخطط} = النمس

const UserSchema = مخطط جديد ({
...
})
UserSchema.pre ("حفظ" ، وظيفة غير متزامنة (التالية) {
يحاول {
// تحقق من طريقة التسجيل
مستخدم const = هذا ؛
if (! user.isModified ('password')) next () ؛
// توليد الملح
const salt = انتظار bcrypt.genSalt (10) ؛
// تجزئة كلمة المرور
const hashedPassword = await bcrypt.hash (this.password، salt) ؛
// استبدال كلمة مرور النص العادي بكلمة مرور مجزأة
this.password = hashedPassword ؛
التالي()؛
} catch (خطأ) {
العودة التالية (خطأ) ؛
}
});
...
مستخدم const = mongoose.model ('مستخدم' ، UserSchema) ؛

هنا أنت تستخدم ملف قبل الحفظ ربط لتعديل كلمة المرور قبل حفظها. الفكرة هي تخزين نسخة التجزئة من كلمة المرور بدلاً من كلمة مرور النص العادي. التجزئة هي سلسلة طويلة معقدة يتم إنشاؤها من سلسلة نصية عادية.

يستخدم تم تعديله للتحقق مما إذا كان يتم تغيير كلمة المرور لأنك تحتاج فقط إلى تجزئة كلمات المرور الجديدة. بعد ذلك ، قم بإنشاء ملح ومرره بكلمة مرور النص العادي إلى طريقة التجزئة لإنشاء كلمة المرور المجزأة. أخيرًا ، استبدل كلمة مرور النص العادي بكلمة المرور المجزأة في قاعدة البيانات.

قم بإنشاء db.js وتكوين قاعدة البيانات.

const النمس = تتطلب ("النمس") ؛
النمس. الوعد = عالمي. يعد؛
const dbUrl = "mongodb: // localhost / المستخدم" ؛
const connect = غير متزامن () => {
mongoose.connect (dbUrl، {useNewUrlParser: true، useUnifiedTopology: true})؛
const ديسيبل = النمس.
db.on ("خطأ"، () => {
console.log ("تعذر الاتصال") ؛
});
db.once ("فتح"، () => {
console.log ("> الاتصال بنجاح بقاعدة البيانات") ؛
});
};
module.exports = {connect} ؛

في app.js ، اتصل بقاعدة البيانات.

// الاتصال ديسيبل
const db = تتطلب ('./ db') ؛
db.connect () ؛

الخطوة 3: إعداد جواز السفر

ثبت جواز سفر و جواز السفر المحلي. سوف تستخدم هذه الحزم للتسجيل وتسجيل المستخدمين.

npm أنا جواز السفر
npm أنا جواز السفر المحلي

قم بإنشاء ملف جديد ، PassportConfig.jsوالاستيراد جواز السفر المحلي و ال userModel.js.

const LocalStraregy = تتطلب ("جواز السفر المحلي"). إستراتيجية ؛
const User = تتطلب ("./ userModel") ؛

تكوين Passport للتعامل مع تسجيل المستخدم.

const LocalStrategy = تتطلب ("جواز السفر المحلي") ؛
const User = تتطلب ("./ userModel") ؛
module.exports = (جواز السفر) => {
جواز السفر.
"اشتراك محلي"،
LocalStrategy الجديدة (
{
usernameField: "البريد الإلكتروني" ،
passwordField: "كلمة المرور" ،
},
غير متزامن (بريد إلكتروني ، كلمة مرور ، تم) => {
يحاول {
// تحقق مما إذا كان المستخدم موجودًا
const userExists = await User.findOne ({"البريد الإلكتروني": البريد الإلكتروني}) ؛
إذا (userExists) {
الإرجاع المنجز (فارغ ، خطأ)
}
// إنشاء مستخدم جديد ببيانات المستخدم المقدمة
مستخدم const = انتظار User.create ({البريد الإلكتروني ، كلمة المرور}) ؛
الإرجاع المنجز (فارغ ، مستخدم) ؛
} catch (خطأ) {
تم (خطأ) ؛
}
}
)
);
}

في الكود أعلاه ، أنت تتحقق مما إذا كان البريد الإلكتروني قيد الاستخدام بالفعل. إذا كان البريد الإلكتروني غير موجود ، قم بتسجيل المستخدم. لاحظ أنك تقوم أيضًا بتعيين حقل اسم المستخدم لقبول البريد الإلكتروني. بشكل افتراضي، جواز السفر المحلي يتوقع اسم مستخدم ، لذلك عليك أن تخبره أنك تمرر بريدًا إلكترونيًا بدلاً من ذلك.

يستخدم جواز السفر المحلي للتعامل أيضًا مع تسجيل دخول المستخدم.

module.exports = (جواز السفر) => {
جواز السفر.
"اشتراك محلي"،
إستراتيجية محلية جديدة (
...
)
);
جواز السفر.
"تسجيل الدخول المحلي" ،
LocalStrategy الجديدة (
{
usernameField: "البريد الإلكتروني" ،
passwordField: "كلمة المرور" ،
},
غير متزامن (بريد إلكتروني ، كلمة مرور ، تم) => {
يحاول {
const user = await User.findOne ({email: email}) ؛
إذا (! مستخدم) تم إرجاعه (فارغ ، خطأ) ؛
const isMatch = انتظار user.matchPassword (كلمة المرور) ؛
إذا (! isMatch)
تم إرجاعه (فارغ ، خطأ) ؛
// إذا كانت كلمات المرور مطابقة للمستخدم العائد
الإرجاع المنجز (فارغ ، مستخدم) ؛
} catch (خطأ) {
console.log (خطأ)
تم الإرجاع (خطأ ، خطأ) ؛
}
}
)
);
};

هنا ، تحقق مما إذا كان المستخدم موجودًا في قاعدة البيانات ، وإذا كان موجودًا ، فتحقق مما إذا كانت كلمة المرور المقدمة تتطابق مع كلمة المرور الموجودة في قاعدة البيانات. لاحظ أنك تقوم أيضًا باستدعاء matchPassword () على نموذج المستخدم ، فانتقل إلى userModel.js ملف وإضافته.

UserSchema.methods.matchPassword = وظيفة غير متزامنة (كلمة مرور) {
يحاول {
العودة في انتظار bcrypt.compare (كلمة المرور ، this.password) ؛
} catch (خطأ) {
رمي خطأ جديد (خطأ) ؛
}
};

تقارن هذه الطريقة كلمة المرور من المستخدم وكلمة المرور الموجودة في قاعدة البيانات وتعيد true إذا كانت متطابقة.

الخطوة 4: إعداد مسارات المصادقة

أنت الآن بحاجة إلى إنشاء نقاط النهاية التي سيرسل المستخدمون البيانات إليها. الأول هو مسار التسجيل الذي سيقبل البريد الإلكتروني وكلمة المرور للمستخدم الجديد.

في app.js، استخدم البرنامج الوسيط لمصادقة جواز السفر الذي أنشأته للتو لتسجيل المستخدم.

app.post (
 "/ auth / signup"،
Passport.authenticate ('local-signup'، {session: false}) ،
(مطلوب ، الدقة ، التالي) => {
// اشتراك
res.json ({
المستخدم: req.user ،
});
}
);

متعلق ب: المصادقة مقابل. التفويض: ما هو الفرق؟

إذا نجحت ، يجب أن يعيد مسار التسجيل المستخدم الذي تم إنشاؤه.

بعد ذلك ، قم بإنشاء مسار تسجيل الدخول.

app.post (
"/ auth / login"،
Passport.authenticate ('local-login'، {session: false}) ،
(مطلوب ، الدقة ، التالي) => {
// تسجيل الدخول
res.json ({
المستخدم: req.user ،
});
}
);

الخطوة 5: إضافة المسارات المحمية

لقد استخدمت حتى الآن جواز سفر لإنشاء برنامج وسيط يسجل مستخدمًا في قاعدة البيانات وآخر يسمح لمستخدم مسجل بتسجيل الدخول. بعد ذلك ، ستنشئ برمجية وسيطة للترخيص لحماية المسارات الحساسة باستخدام رمز ويب JSON (JWT). لتنفيذ ترخيص JWT ، تحتاج إلى:

  • إنشاء رمز JWT.
  • قم بتمرير الرمز المميز للمستخدم. سيقوم المستخدم بإرسالها مرة أخرى في طلبات الترخيص.
  • تحقق من الرمز الذي أرسله المستخدم مرة أخرى.

سوف تستخدم ملف jsonwebtoken حزمة للتعامل مع JWTs.

قم بتشغيل الأمر التالي لتثبيته.

npm أنا jsonwebtoken

بعد ذلك ، أنشئ رمزًا مميزًا لكل مستخدم قام بتسجيل الدخول بنجاح.

في app.js، يستورد jsonwebtoken وتعديل مسار تسجيل الدخول كما هو موضح أدناه.

app.post (
"/ auth / login"،
Passport.authenticate ('local-login'، {session: false}) ،
(مطلوب ، الدقة ، التالي) => {
// تسجيل الدخول
jwt.sign ({user: req.user}، 'secretKey'، {expiresIn: '1h'}، (err، token) => {
إذا (يخطئ) {
إرجاع res.json ({
الرسالة: "فشل تسجيل الدخول" ،
الرمز المميز: فارغ ،
});
}
res.json ({
رمز
});
})
}
);

في التطبيق الواقعي ، يمكنك استخدام مفتاح سري أكثر تعقيدًا وتخزينه في ملف تكوين.

يعيد مسار تسجيل الدخول رمزًا مميزًا إذا نجح.

يستخدم جواز السفر JWT الوصول إلى الطرق المحمية.

npm أنا جواز السفر- JWT

في PassportConfig.js، تكوين جواز السفر JWT.

const JwtStrategy = تتطلب ("جواز السفر- jwt"). إستراتيجية ؛
const {ExtractJwt} = تتطلب ("جواز السفر- jwt")
module.exports = (جواز السفر) => {
جواز السفر.
"تسجيل الدخول المحلي" ،
LocalStrategy الجديدة (
...
);
جواز السفر.
إستراتيجية Jwt الجديدة (
{
jwtFromRequest: ExtractJwt.fromHeader ("التفويض") ،
مفتاح السر: "secretKey" ،
},
غير متزامن (jwtPayload ، تم) => {
يحاول {
// استخراج المستخدم
مستخدم const = jwtPayload.user ؛
تم (فارغة ، مستخدم) ؛
} catch (خطأ) {
تم (خطأ ، خطأ) ؛
}
}
)
);
};

لاحظ أنك تستخرج JWT من رأس التفويض بدلاً من نص الطلب. هذا يمنع المتسللين من اعتراض الطلب والاستيلاء على الرمز المميز.

لنرى كيف جواز السفر JWT طرق الحراس ، وإنشاء طريق محمي في app.js.

app.get (
"/ مستخدم / محمي" ،
Passport.authenticate ("jwt"، {session: false}) ،
(مطلوب ، الدقة ، التالي) => {
res.json ({user: req.user}) ؛
}
);

يقوم الطلب الذي يحتوي على JWT صالح فقط بإرجاع بيانات المستخدم.

أنت الآن جاهز لنقل مصادقة المستخدم إلى المستوى التالي

في هذا البرنامج التعليمي ، تعلمت كيف يمكنك مصادقة المستخدمين باستخدام بريد إلكتروني وكلمة مرور بمساعدة Passport. قد يبدو الأمر شاقًا في البداية ، لكن العملية بسيطة نسبيًا. يمكنك الذهاب إلى أبعد من ذلك واستخدام موفري الهوية الخارجيين المدعومين بواسطة Passport مثل Twitter و Facebook و Google.

ما هي مصادقة المستخدم وكيف تعمل؟

من المهم فهم أساسيات مصادقة المستخدم لضمان أقصى مستوى من الأمان لحساباتك عبر الإنترنت. لذا ، دعنا نتعمق.

اقرأ التالي

يشاركسقسقةبريد الالكتروني
مواضيع ذات صلة
  • برمجة
  • برمجة
  • لغات البرمجة
  • أدوات البرمجة
عن المؤلف
ماري جاثوني (8 مقالات منشورة)

ماري جاثوني هي مطورة برامج لديها شغف لإنشاء محتوى تقني ليس إعلاميًا فحسب ، بل جذابًا أيضًا. عندما لا تقوم بالبرمجة أو الكتابة ، فإنها تستمتع بالتسكع مع الأصدقاء والتواجد في الهواء الطلق.

المزيد من Mary Gathoni

اشترك في نشرتنا الإخبارية

انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!

انقر هنا للاشتراك