डाटा को एक स्थान से दूसरे स्थान पर भेजना? अपने मन की शांति और अपने उपयोगकर्ताओं की सुरक्षा के लिए, आपको इसे JWT से सुरक्षित करना चाहिए।

जब आप एक ऐप बना रहे हों, तो यह महत्वपूर्ण है कि आप संवेदनशील डेटा को अनधिकृत पहुंच से सुरक्षित रखें। कई आधुनिक वेब, मोबाइल और क्लाउड एप्लिकेशन संचार के प्राथमिक साधन के रूप में REST API का उपयोग करते हैं। नतीजतन, सबसे आगे सुरक्षा के साथ बैकएंड एपीआई को डिजाइन और विकसित करना महत्वपूर्ण है।

REST API को सुरक्षित करने के लिए एक प्रभावी दृष्टिकोण में JSON वेब टोकन (JWTs) शामिल है। ये टोकन उपयोगकर्ता प्रमाणीकरण और प्राधिकरण के लिए एक मजबूत तंत्र प्रदान करते हैं, जिससे दुर्भावनापूर्ण अभिनेताओं द्वारा उपयोग के विरुद्ध संरक्षित संसाधनों को सुरक्षित रखने में मदद मिलती है।

JSON वेब टोकन क्या हैं?

JSON वेब टोकन (जेडब्ल्यूटी) एक व्यापक रूप से इस्तेमाल किया जाने वाला सुरक्षा मानक है। यह क्लाइंट ऐप और बैकएंड सिस्टम के बीच डेटा को सुरक्षित रूप से प्रसारित करने का एक संक्षिप्त, स्व-निहित तरीका प्रदान करता है।

जब उपयोगकर्ता संरक्षित संसाधनों तक पहुँचने के लिए HTTP अनुरोध करते हैं, तो REST API उपयोगकर्ताओं को सुरक्षित रूप से पहचानने और प्रमाणित करने के लिए JWTs का उपयोग कर सकता है।

एक JSON वेब टोकन में तीन अलग-अलग भाग होते हैं: हेडर, पेलोड और हस्ताक्षर। यह प्रत्येक भाग को एनकोड करता है और एक अवधि ("।") का उपयोग करके उन्हें जोड़ता है।

हेडर क्रिप्टोग्राफ़िक एल्गोरिथम का वर्णन करता है जिसका उपयोग टोकन पर हस्ताक्षर करने के लिए किया जाता है, जबकि पेलोड में उपयोगकर्ता और किसी भी अतिरिक्त मेटाडेटा के बारे में डेटा होता है।

अंत में, हेडर, पेलोड और गुप्त कुंजी का उपयोग करके गणना किए गए हस्ताक्षर, टोकन की अखंडता और प्रामाणिकता सुनिश्चित करते हैं।

JWTs की मूल बातें समाप्त होने के बाद, आइए एक Node.js REST API बनाएं और JWTs को लागू करें।

Express.js एप्लिकेशन और MongoDB डेटाबेस सेट अप करें

आप यहां जानेंगे कि साधारण प्रमाणीकरण कैसे बनाया जाता है बाकी एपीआई जो पंजीकरण और लॉगिन कार्यक्षमता दोनों को संभालती है। एक बार लॉगिन प्रक्रिया एक उपयोगकर्ता को प्रमाणित करने के बाद, वे एक सुरक्षित एपीआई मार्ग के लिए HTTP अनुरोध करने में सक्षम होना चाहिए।

आप इसमें प्रोजेक्ट का कोड पा सकते हैं गिटहब रिपॉजिटरी.

प्रारंभ करना, एक एक्सप्रेस वेब सर्वर बनाएँ, और इन पैकेजों को स्थापित करें:

NPM स्थापित करें cors dotenv bycrpt नेवला कुकी-पार्सर क्रिप्टो jsonwebtoken MongoDB

अगला, एक MongoDB डेटाबेस बनाएँ या क्लाउड पर MongoDB क्लस्टर कॉन्फ़िगर करें. फिर डेटाबेस कनेक्शन स्ट्रिंग की प्रतिलिपि बनाएँ, एक बनाएँ .env रूट डायरेक्टरी में फाइल करें, और कनेक्शन स्ट्रिंग में पेस्ट करें:

CONNECTION_STRING = "कनेक्शन स्ट्रिंग"

डेटाबेस कनेक्शन कॉन्फ़िगर करें

कोई नया बनाएं utils/db.js अपने प्रोजेक्ट फ़ोल्डर की रूट डायरेक्टरी में फाइल करें। इस फ़ाइल में, Mongoose का उपयोग करके डेटाबेस कनेक्शन स्थापित करने के लिए निम्न कोड जोड़ें।

कॉन्स्ट नेवला = ज़रूरत होना(नेवला);

कॉन्स्ट कनेक्टडीबी = async () => {
कोशिश {
इंतजार नेवला.कनेक्ट (प्रक्रिया.env. कनेक्शन स्ट्रिंग);
सांत्वना देना।लकड़ी का लट्ठा("MongoDB से जुड़ा!");
} पकड़ना (गलती) {
सांत्वना देना।गलती("MongoDB से कनेक्ट करने में त्रुटि:", गलती);
}
};

मापांक.निर्यात = कनेक्टडीबी;

डेटा मॉडल को परिभाषित करें

Mongoose का उपयोग करके एक साधारण उपयोगकर्ता डेटा स्कीमा को परिभाषित करें। रूट डायरेक्टरी में एक नया बनाएं मॉडल/उपयोगकर्ता.मॉडल.जेएस फ़ाइल और निम्न कोड जोड़ें।

कॉन्स्ट नेवला = ज़रूरत होना(नेवला);

कॉन्स्ट उपयोगकर्ता स्कीमा = नया नेवला। स्कीमा({
उपयोगकर्ता नाम: डोरी,
पासवर्ड: {
प्रकार: डोरी,
आवश्यक: सत्य,
अद्वितीय: सत्य,
},
});

कॉन्स्ट उपयोगकर्ता = नेवला.मॉडल ("उपयोगकर्ता", यूजरस्केमा);
मापांक.निर्यात = उपयोगकर्ता;

एपीआई मार्गों के लिए नियंत्रकों को परिभाषित करें

नियंत्रक कार्य पंजीकरण और लॉगिन का प्रबंधन करेगा; वे इस नमूना कार्यक्रम का एक महत्वपूर्ण हिस्सा हैं। रूट डायरेक्टरी में एक बनाएँ नियंत्रक/उपयोगकर्ता नियंत्रक.जेएस फ़ाइल और निम्न कोड जोड़ें:

  1. उपयोगकर्ता पंजीकरण नियंत्रक को परिभाषित करें।
    कॉन्स्ट उपयोगकर्ता = ज़रूरत होना('../models/user.model');
    कॉन्स्ट बीक्रिप्ट = ज़रूरत होना('बीक्रिप्ट');
    कॉन्स्ट {जेनरेट टोकन} = ज़रूरत होना('../मिडलवेयर/प्रमाणीकरण');

    Export.registerUser = async (अनुरोध, रेस) => {
    कॉन्स्ट {उपयोगकर्ता नाम, पासवर्ड} = req.body;

    कोशिश {
    कॉन्स्ट हैश = इंतजार bcrypt.hash (पासवर्ड, 10);
    इंतजार User.create ({उपयोगकर्ता नाम, पासवर्ड: हैश});
    res.status (201)।भेजना({ संदेश: 'उपयोगकर्ता सफलतापूर्वक पंजीकृत' });
    } पकड़ना (गलती) {
    सांत्वना देनालॉग (त्रुटि);
    res.status (500)।भेजना({ संदेश: 'एक त्रुटि पाई गई!! ' });
    }
    };

    यह कोड स्निपेट bcrypt का उपयोग करके प्रदान किए गए पासवर्ड को हैश करता है और फिर डेटाबेस में एक नया उपयोगकर्ता रिकॉर्ड बनाता है, उपयोगकर्ता नाम और हैश पासवर्ड संग्रहीत करता है। यदि पंजीकरण सफल होता है, तो यह एक सफल संदेश के साथ प्रतिक्रिया भेजता है।
  2. उपयोगकर्ता लॉगिन प्रक्रिया को प्रबंधित करने के लिए लॉगिन नियंत्रक को परिभाषित करें:
    Exports.loginUser = async (अनुरोध, रेस) => {
    कॉन्स्ट {उपयोगकर्ता नाम, पासवर्ड} = req.body;

    कोशिश {
    कॉन्स्ट उपयोगकर्ता = इंतजार User.findOne ({उपयोगकर्ता नाम});

    अगर (! उपयोगकर्ता) {
    वापस करना res.status (404)।भेजना({ संदेश: 'उपयोगकर्ता नहीं मिला' });
    }

    कॉन्स्ट पासवर्डमैच = इंतजार bcrypt.compare (पासवर्ड, user.password);

    अगर (पासवर्ड मैच) {
    वापस करना res.status (401)।भेजना({ संदेश: 'अमान्य प्रवेश करना प्रत्यायक' });
    }

    कॉन्स्ट पेलोड = { उपयोगकर्ता पहचान: उपयोगकर्ता पहचान };
    कॉन्स्ट टोकन = जेनरेट टोकन (पेलोड);
    रेस कुकी ('टोकन', टोकन, { केवल Http: सत्य });
    res.status (200.json({ संदेश: 'लॉग इन सफल'});
    } पकड़ना (गलती) {
    सांत्वना देनालॉग (त्रुटि);
    res.status (500)।भेजना({ संदेश: 'लॉग इन करते समय एक त्रुटि हुई' });
    }
    };

    जब कोई उपयोगकर्ता के लिए एक अनुरोध भेजता है /login मार्ग, उन्हें अनुरोध निकाय में अपने प्रमाणीकरण प्रमाण-पत्र पास करने चाहिए। कोड तब उन क्रेडेंशियल्स को सत्यापित करता है और एक JSON वेब टोकन उत्पन्न करता है। टोकन सुरक्षित रूप से एक कुकी में संग्रहीत किया जाता है केवल Http ध्वज सही पर सेट है। यह क्लाइंट-साइड जावास्क्रिप्ट को टोकन तक पहुंचने से रोकता है, संभावित क्रॉस-साइट स्क्रिप्टिंग (XSS) हमलों से बचाता है।
  3. अंत में, एक संरक्षित मार्ग परिभाषित करें:
    Export.getUsers = async (अनुरोध, रेस) => {
    कोशिश {
    कॉन्स्ट उपयोगकर्ता = इंतजार User.find({});
    res.json (उपयोगकर्ता);
    } पकड़ना (गलती) {
    सांत्वना देनालॉग (त्रुटि);
    res.status (500)।भेजना({ संदेश: 'एक त्रुटि पाई गई!!' });
    }
    };
    JWT को एक कुकी में संग्रहीत करके, प्रमाणित उपयोगकर्ता के बाद के एपीआई अनुरोधों में स्वचालित रूप से टोकन शामिल होगा, जिससे सर्वर को अनुरोधों को मान्य और अधिकृत करने की अनुमति मिलती है।

एक प्रमाणीकरण मिडलवेयर बनाएँ

अब जब आपने एक लॉगिन नियंत्रक परिभाषित कर लिया है जो सफल प्रमाणीकरण पर JWT टोकन उत्पन्न करता है, तो मिडलवेयर प्रमाणीकरण कार्यों को परिभाषित करें जो JWT टोकन को उत्पन्न और सत्यापित करेगा।

रूट डायरेक्टरी में, एक नया फ़ोल्डर बनाएँ, मध्यस्थ. इस फ़ोल्डर के अंदर, दो फ़ाइलें जोड़ें: प्रमाणीकरण.जेएस और config.js.

इस कोड को जोड़ें config.js:

कॉन्स्ट क्रिप्टो = ज़रूरत होना('क्रिप्टो');

मापांकनिर्यात = {
सीक्रेटकी: क्रिप्टो.रैंडमबाइट्स (32)।स्ट्रिंग('हेक्स')
};

यह कोड हर बार चलने पर एक नई यादृच्छिक गुप्त कुंजी उत्पन्न करता है। फिर आप JWTs की प्रामाणिकता पर हस्ताक्षर करने और सत्यापित करने के लिए इस गुप्त कुंजी का उपयोग कर सकते हैं। एक बार एक उपयोगकर्ता सफलतापूर्वक प्रमाणित हो जाने के बाद, गुप्त कुंजी के साथ एक JWT उत्पन्न करें और उस पर हस्ताक्षर करें। सर्वर तब कुंजी का उपयोग यह सत्यापित करने के लिए करेगा कि JWT मान्य है।

में निम्न कोड जोड़ें प्रमाणीकरण.जेएस जो JWTs को उत्पन्न और सत्यापित करने वाले मिडलवेयर कार्यों को परिभाषित करता है।

कॉन्स्ट जेडब्ल्यूटी = ज़रूरत होना('जेसनवेबटोकन');
कॉन्स्ट {गुप्तकी} = ज़रूरत होना('./कॉन्फिग');

कॉन्स्ट जनरेट टोकन = (पेलोड) => {
कॉन्स्ट टोकन = jwt.sign (पेलोड, सीक्रेटकी, { में समाप्त होना: '1 घंटा' });
वापस करना टोकन;
};

कॉन्स्ट सत्यापित टोकन = (अनुरोध, रेस, अगला) => {
कॉन्स्ट टोकन = req.cookies.token;

अगर (! टोकन) {
वापस करना res.status (401.json({ संदेश: 'कोई टोकन प्रदान नहीं किया गया' });
}

jwt.verify (टोकन, सीक्रेटकी, (इरेट, डीकोडेड) => {
अगर (गलती) {
वापस करना res.status (401.json({ संदेश: 'अमान्य टोकन' });
}

req.userId = decoded.userId;
अगला();
});
};

मापांक.निर्यात = {जेनरेट टोकन, सत्यापित टोकन};

GenerateToken फ़ंक्शन एक गुप्त कुंजी का उपयोग करके एक पेलोड पर हस्ताक्षर करके और समाप्ति समय निर्धारित करके एक JWT उत्पन्न करता है सत्यापित टोकन फ़ंक्शन प्रदान किए गए टोकन की प्रामाणिकता और वैधता को सत्यापित करने के लिए मिडलवेयर के रूप में कार्य करता है।

एपीआई मार्गों को परिभाषित करें

कोई नया बनाएं रूट/यूजर रूट्स.जेएस रूट डायरेक्टरी में फाइल करें और निम्न कोड जोड़ें।

कॉन्स्ट एक्सप्रेस = ज़रूरत होना('अभिव्यक्त करना');
कॉन्स्ट राउटर = एक्सप्रेस। राउटर ();
कॉन्स्ट उपयोगकर्ता नियंत्रक = ज़रूरत होना('../नियंत्रक/उपयोगकर्ता नियंत्रक');
कॉन्स्ट {सत्यापनटोकन} = ज़रूरत होना('../मिडलवेयर/प्रमाणीकरण');
रूटर पोस्ट ('/ एपीआई/रजिस्टर', userControllers.registerUser);
रूटर पोस्ट ('/एपीआई/लॉगिन', userControllers.loginUser);
राऊटर.गेट ('/एपीआई/उपयोगकर्ता', सत्यापित टोकन, userControllers.getUsers);
मापांक.निर्यात = रूटर;

अपना सर्वर एंट्री पॉइंट अपडेट करें

अपना अपडेट करें सर्वर.जेएस फ़ाइल निम्न कोड के साथ।

कॉन्स्ट एक्सप्रेस = ज़रूरत होना('अभिव्यक्त करना');
कॉन्स्ट कॉर्स = ज़रूरत होना('कॉर्स');
कॉन्स्ट ऐप = एक्सप्रेस ();
कॉन्स्ट पोर्ट = 5000;
ज़रूरत होना('दोतेनव'.कॉन्फिग ();
कॉन्स्ट कनेक्टडीबी = ज़रूरत होना('./utils/db');
कॉन्स्ट कुकी पार्सर = ज़रूरत होना('कुकी-पार्सर');

कनेक्टडीबी ();

app.use (express.json ());
app.use (express.urlencoded ({ विस्तारित: सत्य }));
app.use (cors ());
app.use (cookieParser ());
कॉन्स्ट उपयोगकर्ता मार्ग = ज़रूरत होना('./रूट्स/यूजररूट्स');
ऐप.उपयोग ('/', यूजर रूट्स);

app.listen (बंदरगाह, () => {
सांत्वना देना।लकड़ी का लट्ठा(`सर्वर सुन रहा है http://localhost:${पोर्ट}`);
});

REST API का परीक्षण करने के लिए, विकास सर्वर को स्पिन करें और परिभाषित समापन बिंदुओं के लिए API अनुरोध करें:

नोड सर्वर.जेएस

Node.js REST API को सुरक्षित करना

Node.js REST API को सुरक्षित करना केवल JWTs का उपयोग करने से परे है, हालांकि वे प्रमाणीकरण में महत्वपूर्ण भूमिका निभाते हैं और प्राधिकरण, अपने बैकएंड की सुरक्षा के लिए सुरक्षा के लिए एक समग्र सुरक्षा दृष्टिकोण अपनाना आवश्यक है सिस्टम। JWTs के साथ, आपको संचार को एन्क्रिप्ट करने, इनपुट सत्यापन और स्वच्छता, और कई अन्य के लिए HTTPS को लागू करने पर भी विचार करना चाहिए।

कई सुरक्षा उपायों को मिलाकर, आप अपने लिए एक मजबूत सुरक्षा ढांचा स्थापित कर सकते हैं Node.js REST API और अनधिकृत पहुंच, डेटा उल्लंघनों और अन्य सुरक्षा के जोखिम को कम करता है धमकी।