मुझे एक पुल अनुरोध की समीक्षा करने की आवश्यकता थी जो एक नमूने के साथ रिपोर्ट की गई समस्या को ठीक कर रहा था और जब परीक्षण पास हो रहे थे, तो ऐसा लगा कि नमूने के साथ कुछ और चल रहा होगा जिसे बदलने की आवश्यकता है।
मैं कुछ समय से JSON वेब टोकन (JWTs का उच्चारण "जोट्स" होता है) के बारे में जानता हूं, मैं उन्हें नहीं जानता। इस पीआर को देखकर मुझे उनके बारे में और गहराई से जानने का मौका मिला।
जेडब्ल्यूटी पार्टियों के बीच सूचना को सुरक्षित रूप से प्रसारित करने के लिए एक खुली मानक विधि है। इनका उपयोग अक्सर उपयोगकर्ताओं को प्रमाणित करने और संसाधनों तक पहुंच को अधिकृत करने के लिए किया जाता है। इनमें 3 भाग होते हैं, एक हेडर, पेलोड और हस्ताक्षर।
IAM सेवा खाता क्रेडेंशियल API IAM सेवा खातों का प्रतिरूपण करने के लिए अल्पकालिक क्रेडेंशियल बनाता है। साइनजेडब्ल्यूटीमेथड सेवा खाते की सिस्टम-प्रबंधित निजी कुंजी का उपयोग करके जेडब्ल्यूटी पर हस्ताक्षर करेगा। साइनजेडब्ल्यूटी विधि के अनुरोध निकाय के भीतर, पेलोड फ़ील्ड में एक क्रमबद्ध JSON ऑब्जेक्ट होना चाहिए जिसमें JWT दावा सेट शामिल हो।
दावे मुख्य जानकारी हैं जो JWT प्रसारित करता है।
यहां वैध दावों के सेट का एक उदाहरण दिया गया है:
{ "iss": "https://cloud.google.com/iam", "sub": "projects/-/serviceAccounts/[email protected]", "aud": "https://my-iap-protected-app.example.com", "iat": 1694003600, "exp": 1694007200 }
इस दावा सेट में निम्नलिखित फ़ील्ड शामिल हैं:
इन दावों को अपने जेडब्ल्यूटी के पेलोड में शामिल करके, आप यह सुनिश्चित कर सकते हैं कि यह वैध है और इसका उपयोग आईएपी-संरक्षित संसाधनों तक पहुंचने के लिए किया जा सकता है।
मूल कोड इस तरह दिखता था
iat = datetime.datetime.now(tz=datetime.timezone.utc) exp = iat 3600 return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": iat, "exp": exp, } )
मुझे पता है कि परीक्षण में कुछ गड़बड़ है लेकिन मैं इस कोड के साथ अंतर्निहित समस्या के समाधान में बाधा नहीं डालना चाहता।
पीआर लेखक ने परिवर्तन प्रस्तुत किया
iat = datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
ऐसा लग रहा था कि यह अधूरा समाधान होगा। एपीआई के दस्तावेज़ीकरण के आधार पर, मुझे एहसास हुआ कि सबमिट किया गया फिक्स अभी भी iat को int टाइप करने के लिए सेट नहीं करेगा और फिर भी विफल रहेगा। मैंने एक छोटे से बदलाव का प्रस्ताव रखा है जिससे पीआर की समस्या का समाधान हो जाएगा
now_utc = datetime.datetime.now(tz=datetime.timezone.utc) iat = int(now_utc.timestamp())
जितना अधिक मैंने इसके बारे में सोचा, मुझे एहसास हुआ कि डेटटाइम इस नमूने के लिए उपयोगी नहीं है। डेटटाइम मॉड्यूल तारीखों और समय में हेरफेर करने के लिए कक्षाएं प्रदान करता है जो तब उपयोगी होते हैं जब आपको तारीखें चाहिए होती हैं। हमें सचमुच यूटीसी में एक पूर्णांक की आवश्यकता है ताकि टाइम मॉड्यूल अधिक उपयोगी हो।
इंसेटैड, हम यह कर सकते हैं
now = int(time.time()) return json.dumps( { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": now, "exp": now 3600, } )
इस नमूने के लिए संपूर्ण (अद्यतन!) कोड यहां पाएं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3