| هل تريد تأمين تطبيقك؟ إليك كيفية استخدام 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;
ما هو secretKey
أهمية secretKey
كيفية اختيار secretKey
- يجب أن يكون secretKey طويلًا ومعقدًا.
- يجب أن يتكون من مجموعة متنوعة من الأحرف والأرقام والرموز.
- يجب تغييره بشكل دوري.
إنشاء secretKey قوي صعب الاختراق
require('crypto').randomBytes(48, function(err, buffer) {
var token = buffer.toString('hex');
});
الكود السابق بشكل كامل
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,
});
}
)}
}
)}
});
إنشاء component لعمل token بشكل اسرع في NodeJs
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)







