सुरक्षित और कुशल REST API बनाने के लिए Nest के संरचित आर्किटेक्चर का उपयोग करें।

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

इसके विपरीत, Nest.js, Express.js और Node.js के शीर्ष पर निर्मित, एक उच्च-स्तरीय अमूर्तता प्रस्तुत करता है यह एक स्पष्ट संरचना, एक मजबूत कोड संगठन दृष्टिकोण और सरलीकृत कार्यान्वयन प्रदान करता है विवरण। अनिवार्य रूप से, Nest.js कुशल और सुरक्षित बैकएंड एपीआई और सेवाओं के निर्माण के लिए एक अधिक संरचित वास्तुकला प्रदान करता है।

Nest.js प्रोजेक्ट स्थापित करना

आरंभ करने के लिए, आपको सबसे पहले नीचे दिए गए कमांड को चलाकर Nest.js की कमांड लाइन (CLI) को विश्व स्तर पर स्थापित करना होगा:

एनपीएम आई -जी @नेस्टजेएस/सीएलआई

एक बार इंस्टॉलेशन पूरा हो जाने पर, आगे बढ़ें, और चलाकर एक नया प्रोजेक्ट बनाएं:

घोंसला नया घोंसला-जेडब्ल्यूटी-एपीआई

इसके बाद, Nest.js CLI आपको निर्भरताएँ स्थापित करने के लिए एक पैकेज मैनेजर चुनने के लिए संकेत देगा। इस ट्यूटोरियल के लिए, हम उपयोग करेंगे एनपीएम, नोड पैकेज मैनेजर. चुनना NPM और प्रतीक्षा करें जब तक सीएलआई एक बुनियादी Nest.js प्रोजेक्ट बनाता है और एप्लिकेशन को चलाने के लिए आवश्यक सभी आवश्यक कॉन्फ़िगरेशन फ़ाइलों और प्रारंभिक निर्भरताओं को स्थापित करता है।

प्रोजेक्ट स्थापित होने के बाद, प्रोजेक्ट निर्देशिका पर जाएँ और विकास सर्वर प्रारंभ करें।

सीडी नेस्ट-जेडब्ल्यूटी-एपीआई
एनपीएम रन प्रारंभ

अंत में, इस प्रोजेक्ट के लिए हम जिन पैकेजों का उपयोग करेंगे उन्हें स्थापित करने के लिए नीचे दिए गए कमांड को चलाएँ।

एनपीएम इंस्टॉल करें मोंगोडब नेवला @nestjs/mongoose @types/bcrypt bcrypt jsonwebtoken @nestjs/jwt

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

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

स्थानीय रूप से एक MongoDB डेटाबेस सेट करें या क्लाउड पर MongoDB क्लस्टर कॉन्फ़िगर करें. डेटाबेस सेट करने के बाद, डेटाबेस कनेक्शन यूआरआई स्ट्रिंग को कॉपी करें, एक बनाएं .env हमारे प्रोजेक्ट फ़ोल्डर की रूट निर्देशिका में फ़ाइल करें, और कनेक्शन स्ट्रिंग में पेस्ट करें:

MONGO_URI='कनेक्शन स्ट्रिंग'

अगला, अद्यतन करें ऐप.मॉड्यूल.ts में स्रोत Mongoose को निम्नानुसार कॉन्फ़िगर करने के लिए निर्देशिका फ़ाइल:

आयात { मापांक } से'@nestjs/common';
आयात { कॉन्फ़िग मॉड्यूल } से'@nestjs/config';
आयात { MongooseModule } से'@nestjs/mongoose';
आयात { ऐपकंट्रोलर } से'./app.controller';
आयात { ऐप सेवा } से'./app.service';
आयात { UserAuthModule } से'./user-auth/user-auth.module';

@मापांक({
आयात: [
configModule.forRoot({
envफ़ाइलपथ: '.env',
वैश्विक है: सत्य,
}),
MongooseModule.forRoot (process.env. MONGO_URI),
उपयोगकर्ताAuthModule,
],
नियंत्रक: [ऐपकंट्रोलर],
प्रदाता: [ऐपसेवा],
})

निर्यातकक्षा ऐपमॉड्यूल {}

प्रदान किया गया कोड Nest.js एप्लिकेशन के लिए तीन आवश्यक मॉड्यूल कॉन्फ़िगर करता है: कॉन्फ़िग मॉड्यूल पर्यावरण विन्यास के लिए, नेवला मॉड्यूल MongoDB कनेक्शन स्थापित करने के लिए, और UserAuthModule उपयोगकर्ता प्रमाणीकरण के लिए. कृपया ध्यान दें कि, इस स्तर पर, कोई त्रुटि हो सकती है UserAuthModule अभी तक परिभाषित नहीं किया गया है, लेकिन हम इसे अगले भाग में बनाएंगे।

उपयोगकर्ता प्रमाणीकरण मॉड्यूल बनाना

स्वच्छ और सुव्यवस्थित कोड बनाए रखने के लिए, निम्नलिखित कमांड चलाकर एक उपयोगकर्ता प्रमाणीकरण मॉड्यूल बनाएं।

नेस्ट जी मॉड्यूल यूजर-ऑथ

Nest.js CLI टूल स्वचालित रूप से आवश्यक मॉड्यूल फ़ाइलें उत्पन्न करता है। इसके अतिरिक्त, यह अद्यतन करेगा ऐप.मॉड्यूल.ts फ़ाइल, जिसमें उपयोगकर्ता प्रमाणीकरण मॉड्यूल से संबंधित आवश्यक परिवर्तन शामिल हैं।

आप मुख्य प्रोजेक्ट कॉन्फ़िगरेशन फ़ाइलों को मैन्युअल रूप से बनाने का विकल्प चुन सकते हैं, फिर भी, सीएलआई उपकरण सरल बनाता है यह प्रक्रिया स्वचालित रूप से आवश्यक आइटम बनाकर, इसके अलावा, तदनुसार परिवर्तनों को अद्यतन करती है ऐप.मॉड्यूल.ts फ़ाइल।

एक उपयोगकर्ता स्कीमा बनाएं

नव निर्मित के अंदर उपयोगकर्ता-लेखक फ़ोल्डर में स्रोत निर्देशिका, एक नई बनाएँ schemas/user-auth.schema.ts फ़ाइल बनाएं, और Mongoose स्कीमा बनाने के लिए निम्न कोड जोड़ें उपयोगकर्ता नमूना

आयात { प्रोप, स्कीमा, स्कीमाफैक्ट्री } से'@nestjs/mongoose';
आयात { दस्तावेज़ } से'नेवला';

@स्कीमा({ टाइमस्टैम्प: सत्य })
निर्यातकक्षा उपयोगकर्ता {
@प्रोप()
उपयोगकर्ता नाम: डोरी;
@प्रोप()
पासवर्ड: डोरी;
}

निर्यातप्रकार उपयोगकर्ता दस्तावेज़ = उपयोगकर्ता और दस्तावेज़;
निर्यातकॉन्स्ट UserSchema = SchemaFactory.createForClass (उपयोगकर्ता);

उपयोगकर्ता प्रमाणीकरण सेवा बनाना

अब, आइए उपयोगकर्ता प्रमाणीकरण सेवा बनाएं जो नीचे दिए गए आदेश को चलाकर REST API के लिए प्रमाणीकरण तर्क का प्रबंधन करेगी:

नेस्ट जी सेवा उपयोगकर्ता-प्रमाणीकरण

यह आदेश एक बनाएगा उपयोगकर्ता-auth.service.ts उपयोगकर्ता-लेखक निर्देशिका के अंदर फ़ाइल। इस फ़ाइल को खोलें और इसे निम्नलिखित कोड के साथ अपडेट करें।

  1. सबसे पहले, निम्नलिखित आयात करें.
    आयात { इंजेक्टेबल, नॉटफाउंडएक्सेप्शन, लॉगर, अनऑथराइज्डएक्सेप्शन } से'@nestjs/common';
    आयात { इंजेक्टमॉडल } से'@nestjs/mongoose';
    आयात { नमूना } से'नेवला';
    आयात { उपयोगकर्ता } से'./schemas/user-auth.schema';
    आयात * जैसा bcrypt से'बीक्रिप्ट';
    आयात { JwtService } से'@nestjs/jwt';
  2. फिर, एक बनाएं उपयोगकर्ता प्रमाणीकरण सेवा वह वर्ग जो उपयोगकर्ता पंजीकरण, लॉगिन और सभी उपयोगकर्ता डेटा मार्गों को पुनर्प्राप्त करने की कार्यक्षमता को समाहित करता है।
@इंजेक्शन योग्य()
निर्यातकक्षा उपयोगकर्ता प्रमाणीकरण सेवा {
निजी केवल पढ़ने योग्य लकड़हारा = नया लकड़हारा (UserAuthService.name);
निर्माता(@इंजेक्टमॉडल(उपयोगकर्ता नाम) निजी उपयोगकर्ता मॉडल: मॉडल, निजी जेडब्ल्यूटीसेवा: जेडब्ल्यूटीसेवा) {}

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

async लॉगिन उपयोगकर्ता (उपयोगकर्ता नाम: डोरी, पासवर्ड: डोरी): वादा<डोरी> {
कोशिश {
कॉन्स्ट उपयोगकर्ता = इंतजारयह.userModel.findOne({ उपयोगकर्ता नाम });
अगर (! उपयोगकर्ता) {
फेंकनानया NotFoundException('उपयोगकर्ता नहीं मिला');
}
कॉन्स्ट पासवर्डमैच = इंतजार bcrypt.compare (पासवर्ड, उपयोगकर्ता.पासवर्ड);
अगर (! पासवर्डमैच) {
फेंकनानया अनधिकृत अपवाद('अमान्य प्रवेश करना प्रत्यायक');
}
कॉन्स्ट पेलोड = { उपयोगकर्ता आईडी: उपयोगकर्ता._आईडी };
कॉन्स्ट टोकन = यह.jwtService.sign (पेलोड);
वापस करना टोकन;
} पकड़ना (गलती) {
सांत्वना देना.लॉग (त्रुटि);
फेंकनानया अनधिकृत अपवाद('लॉग इन करते समय एक त्रुटि हुई');
}
}

async getUsers(): वादा {
कोशिश {
कॉन्स्ट उपयोगकर्ता = इंतजारयह.userModel.find({});
वापस करना उपयोगकर्ता;
} पकड़ना (गलती) {
यह.लॉगर.त्रुटि(`उपयोगकर्ताओं को पुनः प्राप्त करते समय एक त्रुटि उत्पन्न हुई: ${त्रुटि.संदेश}`);
फेंकनानयागलती('उपयोगकर्ताओं को पुनः प्राप्त करते समय एक त्रुटि उत्पन्न हुई');
}
}
}

उपयोगकर्ता प्रमाणीकरण सेवा क्लास उपयोगकर्ता पंजीकरण, लॉगिन और उपयोगकर्ता डेटा पुनर्प्राप्त करने के तर्क को लागू करता है। इसका उपयोग करता है उपयोगकर्तामॉडल डेटाबेस के साथ इंटरैक्ट करने और पासवर्ड को हैश करने सहित आवश्यक क्रियाएं करने के लिए पंजीकरण, लॉगिन क्रेडेंशियल को मान्य करना, और अंत में, सफल होने के बाद JWT टोकन उत्पन्न करना प्रमाणीकरण.

प्रमाणीकरण गार्ड लागू करना

संवेदनशील संसाधनों की सुरक्षा सुनिश्चित करने के लिए, केवल अधिकृत उपयोगकर्ताओं तक पहुंच सीमित करना महत्वपूर्ण है। यह एक सुरक्षा उपाय लागू करके हासिल किया जाता है जो संरक्षित समापन बिंदुओं पर किए गए बाद के एपीआई अनुरोधों में एक वैध जेडब्ल्यूटी की उपस्थिति को अनिवार्य करता है, इस मामले में, उपयोगकर्ताओं मार्ग। में उपयोगकर्ता-लेखक निर्देशिका, एक नई बनाएँ auth.guard.ts फ़ाइल करें और नीचे दिया गया कोड जोड़ें।

आयात { CanActivate, ExecutionContext, Injectable, UnauthorizedException } से'@nestjs/common';
आयात { JwtService } से'@nestjs/jwt';
आयात { अनुरोध } से'अभिव्यक्त करना';
आयात {गुप्तकुंजी} से'./config';

@इंजेक्शन योग्य()
निर्यातकक्षा ऑथगार्ड औजार सक्रिय कर सकते हैं {
निर्माता(निजी जेडब्ल्यूटीसेवा: जेडब्ल्यूटीसेवा) {}

async सक्रिय कर सकते हैं (संदर्भ: ExecutionContext): वादा<बूलियन> {
कॉन्स्ट अनुरोध = context.switchToHttp().getRequest();
कॉन्स्ट टोकन = यह.extractTokenFromHeader (अनुरोध);
अगर (!टोकन) {
फेंकनानया अनधिकृत अपवाद();
}
कोशिश {
कॉन्स्ट पेलोड = इंतजारयह.jwtService.verifyAsync (टोकन, {
रहस्य: गुप्तकुंजी.गुप्त,
});
अनुरोध['उपयोगकर्ता'] = पेलोड;
} पकड़ना {
फेंकनानया अनधिकृत अपवाद();
}
वापस करनासत्य;
}
निजी ExtractTokenFromHeader (अनुरोध: अनुरोध): डोरी | अपरिभाषित {
कॉन्स्ट [प्रकार, टोकन] = request.headers.authorization?.split(' ')?? [];
वापस करनाप्रकार'ले जानेवाला'? टोकन: अपरिभाषित;
}
}

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

यह अनुरोध हेडर से JWT टोकन निकालता है, इसका उपयोग करके इसकी प्रामाणिकता को सत्यापित करता है Jwtसेवा, और डिकोडेड पेलोड को असाइन करता है अनुरोध['उपयोगकर्ता'] आगे की प्रक्रिया के लिए संपत्ति. यदि टोकन गुम या अमान्य है, तो यह एक फेंक देता है अनधिकृत अपवाद संरक्षित मार्ग तक पहुंच को रोकने के लिए।

अब, बनाएँ config.ts उसी निर्देशिका में फ़ाइल करें, और नीचे कोड जोड़ें।

निर्यातकॉन्स्ट सीक्रेटकी = {
गुप्त: 'गुप्त मूल्य.',
};

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

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

एक नियंत्रक बनाएं जो उपयोगकर्ता प्रमाणीकरण के लिए एपीआई एंडपॉइंट को संभालता है।

नेस्ट जी नियंत्रक उपयोगकर्ता-प्रमाणीकरण

इसके बाद इसमें दिए गए कोड को कॉपी करें GitHub रिपॉजिटरी फ़ाइल, और इसे इसमें जोड़ें उपयोगकर्ता-auth.controller.ts फ़ाइल—यह उपयोगकर्ता पंजीकरण, लॉगिन और उपयोगकर्ता डेटा पुनर्प्राप्त करने के लिए अंतिम बिंदुओं को परिभाषित करती है। यूज़गार्ड्स (ऑथगार्ड) प्रमाणीकरण लागू करने के लिए डेकोरेटर को शामिल किया गया है उपयोगकर्ता प्राप्त करें समापन बिंदु, यह सुनिश्चित करते हुए कि केवल प्रमाणित उपयोगकर्ताओं को ही पहुंच प्रदान की जाती है।

user-auth.module.ts फ़ाइल को अद्यतन करें

प्रोजेक्ट में किए गए परिवर्तनों को प्रतिबिंबित करने के लिए, अद्यतन करें उपयोगकर्ता-auth.module.ts उपयोगकर्ता प्रमाणीकरण के लिए आवश्यक मॉड्यूल, सेवाओं और नियंत्रकों को कॉन्फ़िगर करने के लिए फ़ाइल।

आयात {मॉड्यूल, नेस्टमॉड्यूल, मिडलवेयरकंज्यूमर } से'@nestjs/common';
आयात { JwtModule } से'@nestjs/jwt';
आयात { UserAuthController } से'./user-auth.controller';
आयात { UserAuthService } से'./user-auth.service';
आयात { MongooseModule } से'@nestjs/mongoose';
आयात { उपयोगकर्ता स्कीमा } से'./schemas/user-auth.schema';
आयात {गुप्तकुंजी} से'./config';

@मापांक({
आयात: [
MongooseModule.forFeature([{नाम: 'उपयोगकर्ता', स्कीमा: यूजरस्कीमा }]),
JwtModule.register({
रहस्य: गुप्तकुंजी.गुप्त,
साइनऑप्शंस: { एक्सपायरइन: '1 घंटा' },
}),
],
नियंत्रक: [UserAuthController],
प्रदाता: [UserAuthService],
})

निर्यातकक्षा UserAuthModule औजार नेस्टमॉड्यूल {
कॉन्फ़िगर करें (उपभोक्ता: मिडिलवेयरकंज्यूमर) {
}
}

अंत में, विकास सर्वर को स्पिन करें और पोस्टमैन का उपयोग करके एपीआई एंडपॉइंट का परीक्षण करें।

एनपीएम रन प्रारंभ

सुरक्षित Nest.js REST API का निर्माण

सुरक्षित Nest.js REST API के निर्माण के लिए एक व्यापक दृष्टिकोण की आवश्यकता होती है जो प्रमाणीकरण और प्राधिकरण के लिए केवल JWT पर निर्भर होने से कहीं आगे जाता है। जबकि जेडब्ल्यूटी महत्वपूर्ण हैं, अतिरिक्त सुरक्षा उपायों को लागू करना भी उतना ही महत्वपूर्ण है।

इसके अतिरिक्त, एपीआई विकास के हर चरण में सुरक्षा को प्राथमिकता देकर, आप अपने बैकएंड सिस्टम की सुरक्षा सुनिश्चित कर सकते हैं।