JSON वेब टोकन का उपयोग करना और डीबग करना आसान है, लेकिन वे प्रभावशाली सुरक्षा वृद्धि भी प्रदान करते हैं।

टूटा हुआ प्रमाणीकरण आधुनिक वेब अनुप्रयोगों में लगातार भेद्यता बना हुआ है - यह अभी भी OWASP के शीर्ष 10 एपीआई सुरक्षा जोखिमों में उच्च स्थान पर है।

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

जानें कि आप JSON वेब टोकन (JWT), एक लोकप्रिय और प्रभावी टोकन-आधारित विधि का उपयोग करके फ्लास्क में उपयोगकर्ता प्रमाणीकरण कैसे लागू कर सकते हैं।

JSON वेब टोकन का उपयोग करके टोकन-आधारित प्रमाणीकरण

टोकन-आधारित प्रमाणीकरण किसी सिस्टम या संसाधन तक पहुंच को मान्य और अधिकृत करने के लिए वर्णों की एन्क्रिप्टेड स्ट्रिंग का उपयोग करता है। आप सत्र टोकन, एपीआई कुंजी और JSON वेब टोकन सहित विभिन्न तरीकों का उपयोग करके इस प्रकार के प्रमाणीकरण को कार्यान्वित कर सकते हैं।

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

instagram viewer

JWT में तीन मुख्य घटक होते हैं: हेडर, पेलोड और हस्ताक्षर। हेडर में टोकन के बारे में मेटाडेटा शामिल है, जिसमें टोकन को एन्कोड करने के लिए उपयोग किया जाने वाला हैशिंग एल्गोरिदम भी शामिल है।

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

जेडब्ल्यूटी का उपयोग करके, आप उपयोगकर्ताओं को प्रमाणित कर सकते हैं और टोकन के भीतर ही सत्र डेटा संग्रहीत कर सकते हैं।

एक फ्लास्क प्रोजेक्ट और एक MongoDB डेटाबेस सेट करें

आरंभ करने के लिए, टर्मिनल का उपयोग करके एक नई प्रोजेक्ट निर्देशिका बनाएं:

mkdir फ्लास्क-प्रोजेक्ट
सीडी फ्लास्क-परियोजना

अगला, इंस्टॉल करें वर्चुअलएन्व, अपने फ्लास्क प्रोजेक्ट के लिए एक स्थानीय आभासी विकास वातावरण बनाने के लिए।

वर्चुअलएन्व वेनव

अंत में, आभासी वातावरण को सक्रिय करें।

# यूनिक्स या मैकओएस: 
स्रोत वेनवी/बिन/सक्रिय करें

# खिड़कियाँ:
.\venv\स्क्रिप्ट\सक्रिय करें

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

आवश्यक पैकेज स्थापित करें

अपने प्रोजेक्ट फ़ोल्डर की रूट डायरेक्टरी में, एक नया बनाएं आवश्यकताएँ.txt फ़ाइल बनाएं, और प्रोजेक्ट के लिए ये निर्भरताएँ जोड़ें:

फ्लास्क
pyjwt
अजगर-dotenv
पाइमोंगो
bcrypt

अंत में, पैकेजों को स्थापित करने के लिए नीचे दिए गए कमांड को चलाएँ। आप सुनिश्चित करें कि आपके पास रंज (पैकेज प्रबंधक) स्थापित; अगर नहीं, इसे अपने विंडोज़, मैक या लिनक्स सिस्टम पर इंस्टॉल करें.

पिप इंस्टॉल -आर आवश्यकताएँ.txt

एक MongoDB डेटाबेस बनाएं

आगे बढ़ें और एक MongoDB डेटाबेस बनाएं। तुम कर सकते हो एक स्थानीय MongoDB डेटाबेस स्थापित करें, वैकल्पिक रूप से, MongoDB एटलस, एक क्लाउड-आधारित MongoDB सेवा, पर एक क्लस्टर बनाएं.

एक बार जब आप डेटाबेस बना लें, तो कनेक्शन यूआरआई कॉपी करें, एक बनाएं .env अपने प्रोजेक्ट की रूट डायरेक्टरी में फ़ाइल करें, और इसे निम्नानुसार जोड़ें:

MONGO_URI=''"

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

से पाइमोंगो आयात मोंगोक्लाइंट

डीईएफ़कनेक्ट_टू_मोंगोडब(mongo_uri):
क्लाइंट = MongoClient (mongo_uri)
डीबी = client.get_database("उपयोगकर्ता")
वापस करना डाटाबेस

यह फ़ंक्शन दिए गए कनेक्शन यूआरआई का उपयोग करके MongoDB डेटाबेस से एक कनेक्शन स्थापित करता है। यह फिर एक नया बनाता है उपयोगकर्ताओं संग्रह यदि यह मौजूद नहीं है, और संबंधित डेटाबेस उदाहरण लौटाता है।

फ्लास्क वेब सर्वर बनाएं

डेटाबेस कॉन्फ़िगर होने के साथ, आगे बढ़ें, और एक बनाएं ऐप.पी.ई प्रोजेक्ट फ़ोल्डर की रूट निर्देशिका में फ़ाइल करें, और फ्लास्क एप्लिकेशन का एक उदाहरण बनाने के लिए निम्नलिखित कोड जोड़ें।

से फ्लास्क आयात फ्लास्क
से रूट्स.यूजर_ऑथ आयात रजिस्टर_रूट्स
से utils.db आयात कनेक्ट_टू_मोंगोडब
आयात ओएस
से dotenv आयात लोड_डोटेनव

ऐप = फ्लास्क (__नाम__)
लोड_डोटेनव()

mongo_uri = os.getenv('MONGO_URI')
डीबी = कनेक्ट_टू_मोंगोडब (मोनगो_यूरी)

रजिस्टर_रूट्स (ऐप, डीबी)

अगर __नाम__ == '__मुख्य__':
ऐप.रन (डीबग=सत्य)

प्रमाणीकरण एपीआई एंडपॉइंट बनाएं

आपके फ्लास्क एप्लिकेशन में उपयोगकर्ता प्रमाणीकरण को लागू करने के लिए, आवश्यक एपीआई एंडपॉइंट को परिभाषित करना महत्वपूर्ण है जो प्रमाणीकरण-संबंधित संचालन को संभालते हैं।

हालाँकि, पहले, उपयोगकर्ताओं के डेटा के लिए मॉडल को परिभाषित करें। ऐसा करने के लिए, एक नया बनाएं मॉडल/user_model.py रूट निर्देशिका में फ़ाइल करें, और निम्न कोड जोड़ें।

से pymongo.संग्रह आयात संग्रह
से bson.objectid आयात ऑब्जेक्टआई.डी

कक्षाउपयोगकर्ता:
डीईएफ़__इस में__(स्वयं, संग्रह: संग्रह, उपयोगकर्ता नाम: str, पासवर्ड: str):
स्व.संकलन = संग्रह
स्वयं उपयोक्तानाम = उपयोक्तानाम
स्व.पासवर्ड = पासवर्ड
डीईएफ़बचाना(खुद):
उपयोगकर्ता_डेटा = {
'उपयोगकर्ता नाम': स्वयं.उपयोगकर्ता नाम,
'पासवर्ड': स्वयं.पासवर्ड
}
परिणाम = self.collection.insert_one (user_data)
वापस करना str (परिणाम.inserted_id)

@staticmethod
डीईएफ़ढूंढें_द्वारा_आईडी(संग्रह: संग्रह, उपयोगकर्ता_आईडी: str):
वापस करना संग्रह.खोज_एक({'_पहचान': ऑब्जेक्ट आईडी (user_id)})

@staticmethod
डीईएफ़उपयोक्तानाम_द्वारा_खोजें(संग्रह: संग्रह, उपयोगकर्ता नाम: str):
वापस करना संग्रह.खोज_एक({'उपयोगकर्ता नाम': उपयोगकर्ता नाम})

उपरोक्त कोड निर्दिष्ट करता है a उपयोगकर्ता क्लास जो एक डेटा मॉडल के रूप में कार्य करता है और उपयोगकर्ता-संबंधित संचालन करने के लिए MongoDB संग्रह के साथ बातचीत करने के लिए कई तरीकों को परिभाषित करता है।

  1. बचाना विधि MongoDB संग्रह में दिए गए उपयोगकर्ता नाम और पासवर्ड के साथ एक नया उपयोगकर्ता दस्तावेज़ सहेजती है और सम्मिलित दस्तावेज़ की आईडी लौटाती है।
  2. ढूंढें_द्वारा_आईडी और उपयोक्तानाम_द्वारा_खोजें विधियाँ क्रमशः प्रदान की गई उपयोगकर्ता आईडी या उपयोगकर्ता नाम के आधार पर संग्रह से उपयोगकर्ता दस्तावेज़ पुनर्प्राप्त करती हैं।

प्रमाणीकरण मार्गों को परिभाषित करें

  1. आइए पंजीकरण मार्ग को परिभाषित करके शुरुआत करें। यह मार्ग MongoDB उपयोगकर्ता संग्रह में नया उपयोगकर्ता डेटा जोड़ेगा। रूट डायरेक्टरी में, एक नया बनाएं रूट/user_auth.py फ़ाइल, और निम्न कोड।
    आयात जेडब्ल्यूटी
    से functools आयात wraps
    से फ्लास्क आयात jsonify, अनुरोध, make_response
    से मॉडल.उपयोगकर्ता_मॉडल आयात उपयोगकर्ता
    आयात bcrypt
    आयात ओएस

    डीईएफ़रजिस्टर_रूट्स(ऐप, डीबी):
    संग्रह = db.users
    ऐप.कॉन्फ़िग['गुप्त कुंजी'] = os.urandom(24)

    @app.route('/api/register', मेथड्स=['POST'])
    डीईएफ़पंजीकरण करवाना():

    उपयोक्तानाम = request.json.get('उपयोगकर्ता नाम')
    पासवर्ड = request.json.get('पासवर्ड')

    मौजूदा_उपयोगकर्ता = उपयोगकर्ता.find_by_username (संग्रह, उपयोगकर्ता नाम)
    अगर मौजूदा उपयोगकर्ता:
    वापस करना jsonify({'संदेश': 'उपयोगकर्ता का नाम पहले से मौजूद है!'})

    हैशेड_पासवर्ड = bcrypt.hashpw (password.encode('यूटीएफ-8'), bcrypt.gensalt())
    new_user = उपयोगकर्ता (संग्रह, उपयोगकर्ता नाम, hashed_password.decode('यूटीएफ-8'))
    उपयोगकर्ता_आईडी = new_user.save()

    वापस करना jsonify({'संदेश': 'उपयोगकर्ता सफलतापूर्वक पंजीकृत!', 'उपयोगकर्ता पहचान': उपयोगकर्ता पहचान})

  2. प्रमाणीकरण प्रक्रिया को संभालने और उपयोगकर्ता क्रेडेंशियल सत्यापित करने के लिए लॉगिन कार्यक्षमता लागू करें। पंजीकरण मार्ग के अंतर्गत, निम्नलिखित कोड जोड़ें।
     @app.route('/api/login', तरीकों=['POST'])
    डीईएफ़लॉग इन करें():
    उपयोक्तानाम = request.json.get('उपयोगकर्ता नाम')
    पासवर्ड = request.json.get('पासवर्ड')
    उपयोगकर्ता = उपयोगकर्ता.find_by_username (संग्रह, उपयोगकर्ता नाम)
    अगर उपयोगकर्ता:
    अगर bcrypt.checkpw (password.encode('यूटीएफ-8'), उपयोगकर्ता['पासवर्ड'].एन्कोड('यूटीएफ-8')):
    टोकन = jwt.encode({'उपयोगकर्ता पहचान': str (उपयोगकर्ता['_पहचान'])}, ऐप.कॉन्फ़िग['गुप्त कुंजी'], एल्गोरिथम='एचएस256')

    प्रतिक्रिया = make_response (jsonify({'संदेश': 'लॉग इन सफल!'}))
    प्रतिक्रिया.सेट_कुकी('टोकन', टोकन)
    वापस करना जवाब

    वापस करना jsonify({'संदेश': 'अमान्य उपयोगकर्ता नाम या पासवर्ड'})

    लॉगिन एंडपॉइंट दो काम करता है: यह आपूर्ति किए गए उपयोगकर्ता क्रेडेंशियल्स को सत्यापित करता है और, सफल प्रमाणीकरण पर, यह उस उपयोगकर्ता के लिए एक अद्वितीय JWT उत्पन्न करता है। यह इस टोकन को प्रतिक्रिया में एक कुकी के रूप में सेट करता है, साथ ही एक JSON पेलोड एक सफल लॉगिन का संकेत देता है। यदि क्रेडेंशियल अमान्य हैं, तो यह इंगित करने के लिए एक JSON प्रतिक्रिया लौटाएगा।
  3. एक डेकोरेटर फ़ंक्शन को परिभाषित करें जो बाद के एपीआई अनुरोधों के साथ पारित JSON वेब टोकन (JWTs) को सत्यापित करता है। नीचे दिए गए कोड को अंदर जोड़ें रजिस्टर_रूट्स फ़ंक्शन कोड ब्लॉक.
    डीईएफ़टोकन_आवश्यक(एफ):
    @रैप्स (एफ)
    डीईएफ़सजा हुआ(*आर्ग्स, **क्वार्ग्स):
    टोकन = request.cookies.get('टोकन')

    अगरनहीं टोकन:
    वापस करना jsonify({'संदेश': 'टोकन गायब है!'}), 401

    कोशिश:
    डेटा = jwt.decode (टोकन, ऐप.कॉन्फ़िग['गुप्त कुंजी'], एल्गोरिदम=['एचएस256'])
    current_user = User.find_by_id (संग्रह, डेटा['उपयोगकर्ता पहचान'])
    के अलावा jwt. समय सीमा समाप्तहस्ताक्षरत्रुटि:
    वापस करना jsonify({'संदेश': 'टोकन समाप्त हो गया है!'}), 401
    के अलावा jwt. अमान्यटोकनत्रुटि:
    वापस करना jsonify({'संदेश': 'अमान्य टोकन!'}), 401

    वापस करना f (वर्तमान_उपयोगकर्ता, *आर्ग, **क्वार्ग)

    वापस करना सजा हुआ

    यह डेकोरेटर फ़ंक्शन बाद के एपीआई अनुरोधों में एक वैध JWT टोकन की उपस्थिति सुनिश्चित करता है। यह जाँचता है कि टोकन गुम है, समाप्त हो गया है, या वैध है, और यदि है तो उचित JSON प्रतिक्रिया देता है।
  4. अंत में, एक संरक्षित मार्ग बनाएं।
     @app.route('/api/users', मेथड्स=['GET'])
    @टोकन_आवश्यक
    डीईएफ़उपयोगकर्ता प्राप्त करें(तात्कालिक प्रयोगकर्ता):
    उपयोगकर्ता = सूची (संग्रह.खोजें({}, {'_पहचान': 0}))
    वापस करना jsonify (उपयोगकर्ता)

यह एंडपॉइंट डेटाबेस से उपयोगकर्ता डेटा पुनर्प्राप्त करने के लिए तर्क को संभालता है, लेकिन डेटा तक पहुंचने के लिए क्लाइंट को एक वैध टोकन शामिल करने के लिए अनुरोध भेजने की आवश्यकता होती है।

अंत में, डेवलपमेंट सर्वर को चालू करने के लिए नीचे दिए गए कमांड को चलाएँ।

कुप्पी चलाना

पंजीकरण, लॉगिन और संरक्षित उपयोगकर्ताओं के समापन बिंदु का परीक्षण करने के लिए, आप पोस्टमैन या किसी अन्य एपीआई क्लाइंट का उपयोग कर सकते हैं। को अनुरोध भेजें http://localhost: 5000/api/और इन एपीआई एंडपॉइंट्स की कार्यक्षमता को सत्यापित करने के लिए प्रतिक्रियाओं का निरीक्षण करें।

क्या टोकन प्रमाणीकरण एक अचूक सुरक्षा उपाय है?

JSON वेब टोकन आपके वेब ऐप के लिए उपयोगकर्ताओं को प्रमाणित करने का एक मजबूत और प्रभावी तरीका प्रदान करते हैं। हालाँकि, यह समझना महत्वपूर्ण है कि टोकन प्रमाणीकरण फुलप्रूफ नहीं है; यह एक बड़ी सुरक्षा पहेली का केवल एक टुकड़ा है।

टोकन प्रमाणीकरण को अन्य सुरक्षा सर्वोत्तम प्रथाओं के साथ जोड़ें। लगातार निगरानी करना और लगातार सुरक्षा प्रथाओं को अपनाना याद रखें; आप अपने फ्लास्क अनुप्रयोगों की समग्र सुरक्षा में उल्लेखनीय वृद्धि करेंगे।