جدول التنقل
- شرح أنشاء Token للمستخدم بإستخدام JSON Web Token (JWT) في Node.js : شرح شامل
- ما هو JSON Web Token؟
- مميزات استخدام JSON Web Token:
- لماذا نستخدم JWT؟
- تثبيت مكتبة JWT في Node.js
- استخدام JSON Web Token في Node.js:
- ما هو secretKey
- أهمية secretKey
- كيفية اختيار secretKey
- إنشاء secretKey قوي صعب الاختراق
- الكود السابق بشكل كامل
- إنشاء component لعمل token بشكل اسرع في NodeJs
- الحصول على token خلال عملية login في nodejs
- التحقق من صحة ارسال token في headers داخل routes
- كيفية ارسال token من postman
- ما هي Bearer؟
- كيف تعمل Bearer؟
- استخدام JSON Web Token في تطبيقات Node.js
- منصات برمجة:
- تخصص البرمجة:
- البرمجة الحاسوبية:
![]() |
هل تريد تأمين تطبيقك؟ إليك كيفية استخدام JWT في Node.js |
شرح أنشاء Token للمستخدم بإستخدام JSON Web Token (JWT) في Node.js : شرح شامل
في عصر التطبيقات الويبية المتطورة، يزداد الاعتماد على تقنيات المصادقة والتفويض لضمان أمان البيانات والحفاظ على خصوصية المستخدمين. من بين هذه التقنيات، برز JSON Web Token (JWT) كحل فعال لتأمين الوصول إلى التطبيقات وواجهات برمجة التطبيقات (APIs).
ما هو JSON Web Token؟
هو معيار مفتوح لتبادل المعلومات بشكل آمن بين التطبيقات عبر الإنترنت. يتكون من ثلاثة أجزاء:
- الرأس (Header): يحتوي على معلومات حول توقيع الرمز وخوارزمية التشفير المستخدمة.
- الحمولة (Payload): تحتوي على بيانات المستخدم مثل اسم المستخدم ومعرف المستخدم ودوره.
- التوقيع (Signature): يُستخدم للتحقق من صحة الرمز ومنع التلاعب بالبيانات.
مميزات استخدام JSON Web Token:
- سهولة الاستخدام: يتميز JWT بواجهة برمجة تطبيقات بسيطة وسهلة الاستخدام.
- الأمان: يوفر JWT طبقة أمان قوية من خلال استخدام التشفير للتحقق من صحة البيانات ومنع التلاعب بها.
- التوافق: يدعم JWT العديد من لغات البرمجة، بما في ذلك Node.js، مما يجعله خيارًا مناسبًا لتطوير تطبيقات متعددة المنصات.
- خفة الوزن: حجم JWT صغير، مما يجعله مناسبًا للاستخدام في تطبيقات الويب التي تتطلب سرعة عالية.
لماذا نستخدم JWT؟
- أمان عالي : يمكن التحقق من صحة الرمز دون الحاجة إلى تخزينه في قاعدة البيانات.
- قابلية النقل : يمكن إرسال JWT عبر HTTP Headers أو URL.
- دعم متعدد المheaders داخل routesنheaders داخل routesصات : يعمل مع مختلف اللغات والتقنيات.
- إدارة الجلسات : يمكن استخدام JWT كبديل لملفات تعريف الارتباط (Cookies).
تثبيت مكتبة JWT في Node.js
npm i jsonwebtoken
استخدام JSON Web Token في Node.js:
const jwt = require("jsonwebtoken");
var token = jwt.sign({
id: newUser._id , email:newUser.email
},
process.env.JWT_KEY,
{
expiresIn:'1h'
});
newUser.token = token;
هذا الجزء قمنا بعمل توكن من خلال المكتبة وبعدها قمنا بإعطاء التوكن ال id و email الخاص بالمستخدم حتى يتمكن من توليد توكن خاص به وايضا يحتاج منك secretKey وهو رمز مكون من ارقام من احرف ويجب ان يكون مخفي وقوي حتى لا يتمكن اي شخص من اختراق قاعدة البيانات الخاصه بك والوصول الى بيانات المستخدم وهنا قمنا بالحصول على قيمته من .env وهو الملف الذي نضع بداخله العناصر المهمه وقد سبق وشرحنا هذا الملف في درس سابق ولكن سوف نشرح ايضا هذا الجزء في هذه المقاله واخر عنصر اذا كنت ترغب بعمل وقت معين لانتهاء التوكن وهنا كان ساعه يمكنك تخطي هذا الجزء اذا لم تكن ترغب
ما هو secretKey
هو مفتاح سري يستخدم لتوقيع رمز JWT.
يجب أن يكون هذا المفتاح سريًا للغاية ولا يُشارك مع أي شخص آخر.
يُستخدم secretKey للتحقق من صحة رمز JWT ومنع التلاعب بالبيانات.
أهمية secretKey
يُعد secretKey عنصرًا أساسيًا لأمان JWT.
إذا تم اختراق secretKey، يمكن للمهاجمين إنشاء رموز JWT مزيفة وتسجيل الدخول إلى التطبيق بشكل غير مصرح به.
كيفية اختيار secretKey
- يجب أن يكون secretKey طويلًا ومعقدًا.
- يجب أن يتكون من مجموعة متنوعة من الأحرف والأرقام والرموز.
- يجب تغييره بشكل دوري.
إنشاء secretKey قوي صعب الاختراق
يمكنك استخدام الكود التالي في مشروعك للحصول على secret قوي ونسخ الرمز
require('crypto').randomBytes(48, function(err, buffer) {
var token = buffer.toString('hex');
});
إنتقل الى ملف .env الذي قمت بإنشاءه في مشروعك واذا لم يكن لديك قم بإنشاءه وضع بداخله JWT_KEY= وضع بعدها الرقم الذي قمت بتوليده
الكود السابق بشكل كامل
User.find({email}).then(async(user)=>{
if (user.length) {
res.json({
"message":"this user is already exists",
});
} else {
newPasswordHash = await bcrypt.hash(password,10);
const newUser = new User({
name,
email,
password: newPasswordHash,
username,
});
var token = jwt.sign({
id: newUser._id , email:newUser.email
},
process.env.JWT_KEY,
{
expiresIn:'1h'
});
newUser.token = token;
newUser.save().then((data)=>{
res.json({
"message":"Successfully to create User",
"data":data,
});
}
)}
}
)}
});
لا تنسى ان يكون متوفر لديك في schema model اسم token .
إنشاء component لعمل token بشكل اسرع في NodeJs
hand_token.js
const jwt = require('jsonwebtoken');
module.exports = async(payload)=>{
const token = jwt.sign(
payload,
process.env.JWT_KEY,
{expiresIn:'15m'}
);
return token;
}
التعديل على الكود السابق
const generateToken = require('../hand_token');
var token = await generateToken({email:newUser.email,id:newUser._id});
الحصول على token خلال عملية login في nodejs
نفس الكود السابق لا يختلف في اي شيئ بعد التحقق من عمليات التحقيق نضع الكود التالي
const jwt = require("jsonwebtoken");
const verifyToken = (req, res, next) =>{
// استخراج رمز JWT من رأس HTTP
const auth = req.headers['authorization'] || req.headers['Authorization'];
// التحقق من وجود رمز JWT
if (!auth ) {
return res.status(401).json({ message: 'No token provided'});
}
// التحقق من صحة رمز JWT
const token = auth.split(' ')[1];
try {
jwt.verify(token, process.env.JWT_KEY);
next();
} catch (error) {
return res.status(401).json({ message: "Invalid token." });
}
};
module.exports = verifyToken;
التحقق من صحة ارسال token في headers داخل routes
const verifyToken = require('./verify_token');
const getAllUsers = router.route('/').get(verifyToken,userController.getAllData)
بهذا لن ينتقل لعرض بيانات المستخدمين الا في حالة تحقق من الشرط الموجود بداخل verifyToken .
كيفية ارسال token من postman
سوف ناتي لاخر خطوه وهيا الاختبار وهنا سوف نستخدم postman وننتقل الى headers ونضع العنصر authorization وبعدها Bearer ############### ونستبدل العلامات السابقه بالتوكن في حالة الحصول على البيانات وهو سوف ينتقل الى اختبار التوكن واذا كان صحيح سوف تحصل على البيانات واذا لم يتحقق سوف يظهر لك خطأ .
ما هي Bearer؟
هي كلمة مفتاحية تُستخدم في بروتوكول OAuth 2.0 لتحديد نوع التوكن المستخدم.
تشير Bearer إلى أن التوكن هو توكن وصول (access token) يمكن استخدامه للوصول إلى مورد محمي.
كيف تعمل Bearer؟
يتم إرسال توكن Bearer في رأس HTTP Authorization.
يجب أن يكون التوكن في شكل "Bearer <token>".
سيقوم الخادم بالتحقق من صحة التوكن وتحديد ما إذا كان المستخدم مُصرحًا له بالوصول إلى المورد.
استخدام JSON Web Token في تطبيقات Node.js
تطبيقات الويب: يمكن استخدام JWT لتأمين الوصول إلى صفحات الويب وتحديد هوية المستخدمين.
واجهات برمجة التطبيقات: يمكن استخدام JWT لتأمين الوصول إلى واجهات برمجة التطبيقات والتحقق من صحة طلبات المستخدمين.
خدمات الدردشة: يمكن استخدام JWT لتأمين الاتصال بين المستخدمين في خدمات الدردشة.
أمثلة على استخدام JSON Web Token في:
منصات برمجة:
GitHub: يستخدم GitHub JWT لتأمين الوصول إلى مستودعات Git.
Bitbucket: يستخدم Bitbucket JWT لتأمين الوصول إلى مستودعات Git.
تخصص البرمجة:
Udemy: يستخدم Udemy JWT لتأمين الوصول إلى الدورات التعليمية.
Coursera: يستخدم Coursera JWT لتأمين الوصول إلى الدورات التعليمية.
البرمجة الحاسوبية:
Stack Overflow: يستخدم Stack Overflow JWT لتأمين الوصول إلى الأسئلة والأجوبة.
GitHub Pages: يستخدم GitHub Pages JWT لتأمين الوصول إلى صفحات الويب.