بصفتك مطورًا ، تقع على عاتقك مسؤولية حماية بيانات المستخدمين من خلال المصادقة. يمكنك استخدام Passport.js لمصادقة المستخدمين في تطبيق Node و Postgres.

ابدأ بإنشاء خادم Node مع نقاط نهاية لتسجيل المستخدمين وتسجيل الدخول وتسجيل الخروج. يمكنك السماح لـ Passport بمعالجة المصادقة لتقييد الوصول غير المصرح به إلى التطبيق الخاص بك.

إنشاء جدول مستخدمين

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

خلققاعدة البيانات عقدة.

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

خلقالطاولةالمستخدمين (
يتم إنشاء المعرّف دائمًا كمفتاح أساسي للهوية ،
البريد الإلكتروني CHAR (128) ،
كلمة المرور CHAR (60)
);

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

إنشاء خادم عقدة

Node.js هي بيئة تشغيل JavaScript من جانب الخادم تتيح لنا إنشاء خوادم HTTP بسرعة. لتبسيط عملية إنشاء الخادم ومسارات HTTP المختلفة ، يمكنك استخدام Express ، إطار عمل ويب Node.js.

instagram viewer

قم بتشغيل هذا الأمر لإنشاء مجلد جديد يسمى postgres-auth:

mkdir postgres-auth

بعد ذلك ، قم بتهيئة npm:

npm الحرف الأول

أخيرًا ، قم بتثبيت Express:

npm التثبيت السريع

تستطيع الآن إنشاء خادم الويب Node.

في ملف جديد يسمى index.js، يضاف ما يلي:

مقدار ثابت صريح = يتطلب("التعبير")؛
مقدار ثابت التطبيق = صريح () ؛
app.use (express.json ()) ؛
app.use (express.urlencoded ({ وسعوا: حقيقي }));
app.listen (3000, () => وحدة التحكم.log ("الاستماع على المنفذ 3000"));

سيؤدي تشغيل هذا الرمز إلى بدء الخادم وتسجيل ما يلي في وحدة التحكم:

الاستماع على المنفذ 3000

الاتصال بـ PostgreSQL

إلى الاتصال بـ PostgreSQL استعمال عقدة postgres. node-postgres هو برنامج تشغيل اتصال يوفر واجهة بين Node و Postgres.

قم بتنفيذ ما يلي لتثبيت node-postrges عبر npm:

npm تثبيت pg

بمجرد تثبيت هذه المكتبة ، قم بإنشاء ملف جديد يسمى db.js وربطها بقاعدة البيانات:

مقدار ثابت {العميل} = يتطلب("ص") ؛
مقدار ثابت {مستخدم ، مضيف ، قاعدة بيانات ، كلمة مرور ، منفذ} = يتطلب("./dbConfig") ؛

مقدار ثابت العميل = الجديد عميل({
المستعمل،
مضيف،
قاعدة البيانات،
كلمه السر،
ميناء،
});

client.connect () ؛
وحدة.exports = client؛

يأخذ التابع client من node-postgres تفاصيل قاعدة البيانات التي تتصل بها. يستورد هذا البرنامج تفاصيل الاتصال الخاصة به من ملف يسمى dbConfig. لذلك ، قم بإنشاء هذا الملف وأضف الكود التالي إليه:

وحدة.exports = {
المستخدم: "postgres" ،
المضيف: "localhost" ،
قاعدة البيانات: "nodeapp" ،
كلمة المرور: "yourPassword" ،
ميناء: 5432,
};

إنشاء وظائف مساعد قاعدة البيانات

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

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

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

قم بإنشاء ملف جديد يسمى المساعد. js واستورد عميل قاعدة البيانات من db.js:

مقدار ثابت العميل = يتطلب("./db.js")

بعد ذلك ، أضف وظيفة جديدة تسمى emailExists ():

مقدار ثابت EmailExists = غير متزامن (بريد إلكتروني) => {
مقدار ثابت البيانات = انتظر client.query ("حدد * من المستخدمين حيث البريد الإلكتروني = $1", [
البريد الإلكتروني،
]);

إذا (data.rowCount == 0) إرجاعخاطئة;
إرجاع data.rows [0];
};

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

لإنشاء دالة تنشئ المستخدم ، أضف دالة تسمى createUser () إلى helper.js:

مقدار ثابت createUser = غير متزامن (البريد الإلكتروني ، كلمة المرور) => {
مقدار ثابت ملح = انتظر bcrypt.genSalt (10);
مقدار ثابت التجزئة = انتظر bcrypt.hash (كلمة المرور ، ملح) ؛

مقدار ثابت البيانات = انتظر client.query (
"أدخل إلى المستخدمين (البريد الإلكتروني وكلمة المرور) القيم ($1, $2) إعادة المعرف والبريد الإلكتروني وكلمة المرور "،
[بريد إلكتروني ، تجزئة]
);

إذا (data.rowCount == 0) إرجاعخاطئة;
إرجاع data.rows [0];
};

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

قم بتثبيت bcryptjs لبدء استخدامه:

npm تثبيت bcryptjs

في helper.js ، قم باستيراد bcryptjs:

مقدار ثابت bcrypt = يتطلب("bcryptjs")

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

قم بإنشاء دالة تسمى matchPassword ():

مقدار ثابت matchPassword = غير متزامن (كلمة المرور ، hashPassword) => {
مقدار ثابت مباراة = انتظر bcrypt.compare (كلمة المرور ، hashPassword) ؛
إرجاع مباراة
};

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

هذه هي جميع الوظائف التي سنستخدمها للتفاعل مع قاعدة البيانات. تأكد من تصديرها جميعًا في النهاية:

وحدة.exports = {emailExists، createUser، matchPassword} ؛

تكوين جواز السفر

Passport عبارة عن برنامج وسيط لمصادقة Node يوفر أكثر من 500 استراتيجية مصادقة مثل تسجيل الدخول الاجتماعي و JSON Web Tokens (JWT) ومصادقة البريد الإلكتروني. سنستخدم الخيار الأخير الذي توفره إستراتيجية جواز السفر المحلي.

استخدم الأمر التالي لتثبيت جواز السفر وجواز السفر المحلي:

npm تثبيت جواز السفر
npm تثبيت جواز السفر المحلي

بعد ذلك ، قم بتكوين Passport لتسجيل دخول المستخدمين الحاليين وتسجيل مستخدمين جدد.

ابدأ بإنشاء ملف جديد PassportConfig.js. بعد ذلك ، قم باستيراد إستراتيجية Passport المحلية ووظائف مساعد قاعدة البيانات التي أنشأتها للتو:

مقدار ثابت LocalStrategy = يتطلب("جواز السفر المحلي") ؛
مقدار ثابت {emailExists، createUser، matchPassword} = يتطلب("./المساعد")؛

في الملف نفسه ، أضف ما يلي لإعداد تسجيل المستخدم:

وحدة.exports = (جواز السفر) => {
جواز السفر.
"اشتراك محلي"،
الجديد LocalStrategy (
{
usernameField: "البريد الإلكتروني" ،
passwordField: "كلمة المرور" ،
},
غير متزامن (البريد الإلكتروني ، كلمة المرور ، تم) => {
محاولة {
مقدار ثابت userExists = انتظر البريد الإلكتروني موجود (البريد الإلكتروني)

إذا (المستخدم موجود) {
إرجاع فعله(لا شيء, خاطئة);
}

مقدار ثابت المستخدم = انتظر createUser (البريد الإلكتروني ، كلمة المرور) ؛
إرجاع فعله(لا شيء، المستعمل)؛
} قبض على (خطأ) {
تم (خطأ) ؛
}
}
)
);
}

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

يتحقق هذا البرنامج أولاً مما إذا كان البريد الإلكتروني مأخوذًا بالفعل باستخدام وظيفة emailExists () من helper.js. إذا لم يكن البريد الإلكتروني موجودًا في قاعدة البيانات ، فسيتم إنشاء مستخدم جديد باستخدام الوظيفة createUser (). أخيرًا ، تقوم بإرجاع كائن المستخدم.

لتسجيل دخول المستخدمين ، أضف ما يلي إلى passConfig.js:

وحدة.exports = (جواز السفر) => {
جواز السفر.
"اشتراك محلي"،
الجديد LocalStrategy (
// اشتراك
)
);
جواز السفر.
"تسجيل الدخول المحلي" ،
الجديد LocalStrategy (
{
usernameField: "البريد الإلكتروني" ،
passwordField: "كلمة المرور" ،
},
غير متزامن (البريد الإلكتروني ، كلمة المرور ، تم) => {
محاولة {
مقدار ثابت المستخدم = انتظر البريد الإلكتروني موجود (البريد الإلكتروني) ؛
إذا (!المستعمل) إرجاع فعله(لا شيء, خاطئة);
مقدار ثابت isMatch = انتظر matchPassword (كلمة المرور ، user.password) ؛
إذا (! isMatch) إرجاع فعله(لا شيء, خاطئة);
إرجاع فعله(لا شيء, {هوية شخصية: معرف المستخدم، البريد الإلكتروني: البريد الالكتروني للمستخدم})؛
} قبض على (خطأ) {
إرجاع تم (خطأ ، خاطئة);
}
}
)
);
};

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

الخطوة الأخيرة هي إنشاء نقاط نهاية API:

  • نشر / مصادقة / اشتراك
  • POST / المصادقة / تسجيل الدخول

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

استيراد وإعداد Passport في ملف جديد باسم server.js:

مقدار ثابت جواز السفر = يتطلب("جواز سفر")؛
يتطلب("./passportConfig") (جواز السفر) ؛

ثم أضف المسارات التالية:

app.post (
"/auth/اشتراك"،
Passport.authenticate ("اشتراك محلي" ، { جلسة: خاطئة }),
(مطلوب ، الدقة ، التالي) => {
res.json ({
المستخدم: req.user ،
});
}
);
app.post (
"/auth/تسجيل الدخول"،
Passport.authenticate ("تسجيل الدخول المحلي" ، { جلسة: خاطئة }),
(مطلوب ، الدقة ، التالي) => {
res.json ({ المستعمل: req.user})؛
}
);

كلا المسارين يعيدان كائن JSON يحتوي على المستخدم في حالة نجاحه.

تحقق من API الخاص بك باستخدام اختبارات الوحدة

يمكنك استخدام Passport لمصادقة تطبيق Node باستخدام تطبيق PostgreSQL. قمت بإنشاء نقاط نهاية API للتسجيل وتسجيل المستخدمين.

بينما يمكنك استخدام عملاء REST مثل Postman لاختبار مدى جودة عمل API ، فإن كتابة اختبارات الوحدة أسهل بكثير. تسمح لك اختبارات الوحدة باختبار الأجزاء الفردية لتطبيقك. بهذه الطريقة ، حتى إذا فشلت نقطة النهاية ، يمكنك تحديد نقطة الفشل بدقة. إحدى الأدوات التي يمكنك استخدامها لاختبار تطبيقات Node هي Jest.