REST- आधारित एप्लिकेशन के लिए JWT प्रमाणीकरण के लिए एंटरप्राइज़ पैटर्न?


9

JWT विनिर्देश केवल पेलोड और इसे कैसे भेजा जाता है, का वर्णन करता है, लेकिन प्रमाणीकरण प्रोटोकॉल को खुला छोड़ देता है, जो लचीलेपन की अनुमति देता है, लेकिन दुर्भाग्य से, लचीलापन एंटीपैटर्न और मिसडाइनस को जन्म दे सकता है।

मैं JWT प्रमाणीकरण के लिए कुछ अच्छी तरह से सोचा और परीक्षण किए गए एंटरप्राइज़ पाटर की तलाश कर रहा हूं, जिसका मैं उपयोग या अनुकूलन कर सकता हूं, लेकिन मैं कुछ पूरा करने में विफल रहा हूं।

मैं क्या सोच रहा था:

  • जब कोई प्राधिकरण शीर्ष लेख पूरा नहीं होता है, या JWT टोकन अमान्य है, या समाप्त हो गया है, तो HTTP 401 भेजें
  • REST चैनल को प्रमाणित, उपयोग / लॉगिन करने के लिए JSON ऑब्जेक्ट के रूप में उपयोगकर्ता नाम और पासवर्ड भेजें
  • टोकन को जीवित रखने के लिए, / रिऐलिव REST चैनल का उपयोग करें, इसे हर N (5) मिनट पर कॉल करें, नया JWT टोकन प्राप्त करें और प्रत्येक कॉल के बाद मौजूदा एक को बदलें (टोकन एम समाप्त होने के बाद M (15) मिनट)

हालाँकि, जो मुझे परेशान करता है, वह उस / चैनल की आवश्यकता है। दूसरी ओर, यह उपयोगकर्ता को दूर रहने के लिए प्रमाणीकरण को रोकने के लिए मुझे मजबूर करता है, भले ही उपयोगकर्ता दूर हो (निर्णय, अगर हम चाहते हैं कि अभी तक निगरानी पूरी नहीं हुई है) और निश्चित रूप से, वे अतिरिक्त कॉल और प्रोटोकॉल के लिए अतिरिक्त जटिलता हैं। क्या दिलचस्प होगा, यह है कि सर्वर स्वतः टोकन को बढ़ाता है। सत्र-आधारित वातावरण में, टाइमस्टैम्प को रीसेट करने से ऐसा होता है, हालांकि, सर्वर को हर बार नया टोकन भेजना होगा, शायद हर बार नहीं, लेकिन एक बार टोकन आर (समाप्ति, 10) मिनट में समाप्त होने वाला है। लेकिन प्रतिक्रिया शरीर में इसे रखने का मतलब JSON प्रतिक्रिया प्रोटोकॉल को संशोधित करना होगा (इसलिए, समाधान आक्रामक और पारदर्शी नहीं है), और एक अतिरिक्त HTTP हेडर डाल रहा है जो क्लाइंट प्रक्रिया नहीं कर सकता है, जरूरी नहीं कि यह एक अच्छा पैटर्न हो। मैं'

क्या कोई तैयार उद्यम पैटर्न है जो मेरे खुले बिंदुओं का जवाब देता है? क्या मेरा प्रोटोकॉल ड्राफ्ट एक विश्वसनीय विचार है? मैं खरोंच से डिजाइन की तुलना में कुछ तैयार उपयोग करना चाहता हूं।


1
हाँ। JWT ने बहुत से लोगों को होमग्रोन 'प्रोटोकॉल' को लागू करने और एक सिद्ध रूपरेखा कोड को फेंकने के लिए प्रेरित किया है। आवश्यकताओं पर स्पष्ट होने के लिए सही समाधान प्राप्त करना महत्वपूर्ण है। 'सत्र ’की समाप्ति जैसी ध्वनियाँ एक आवश्यकता है। क्या लॉग-आउट के लिए मजबूर होना पड़ता है? यानी जहां सर्वर साइड पर कोई कह सकता है, इस उपयोगकर्ता को लॉग आउट करें, या उपयोगकर्ता कह सकता है कि मेरे सभी सत्र लॉग आउट कर सकते हैं।
योशप

जवाबों:


4

JWT ( JSON वेब टोकन के लिए परिचय ) सिर्फ एक टोकन प्रारूप है, प्रमाणीकरण यह उस विनिर्देश के लिए पूरी तरह से दायरे से बाहर है। यह वास्तव में आमतौर पर प्रमाणीकरण प्रणालियों के भीतर उपयोग किया जाता है, लेकिन आप इसे पूरी तरह से अलग-अलग परिदृश्यों के लिए भी उपयोग कर सकते हैं, इसलिए यह उस विनिर्देश के भीतर प्रमाणीकरण विशिष्ट बाधाओं को शामिल नहीं करने के लिए समझ में आता है।

यदि आप प्रमाणीकरण पर मार्गदर्शन की तलाश कर रहे हैं, तो आपको विनिर्देशों के ओपनआईडी कनेक्ट परिवार को संदर्भित करना चाहिए । इसके अतिरिक्त, यदि आपका सिस्टम HTTP API का है और आप अपने या उन थर्ड-पार्टी क्लाइंट एप्लिकेशन को उन API तक पहुँच प्रदान करने में रुचि रखते हैं, तो आपको OAuth 2.0 विनिर्देशन का उल्लेख करना चाहिए ।

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

अपने विशिष्ट खुले बिंदुओं के बारे में:

  • बियरर टोकन प्रमाणीकरण योजना को RFC 6750 में परिभाषित किया गया है जिसमें अनुरोधों और संभावित त्रुटि कोड को निष्पादित करने के निर्देश हैं
  • OAuth2 और OpenID कनेक्ट दोनों संभावना पर विचार करते हैं और टोकन के साथ उपयोगकर्ता नाम / पासवर्ड का आदान-प्रदान करने के तरीके को परिभाषित करते हैं।
  • ताज़ा टोकन के माध्यम से OpenID कनेक्ट और OAuth2 के भीतर एक स्व-निहित / बाय-वैल्यू टोकन (JWT) आजीवन विस्तारित करने की समस्या का समाधान किया जाता है ।

भले ही OAuth2 और OpenID कनेक्ट को अपने कुछ पूर्ववर्तियों की तुलना में लागू करने में आसान के रूप में देखा जा सकता है, वे अभी भी कुछ सावधानी बरतने के लिए पर्याप्त जटिल हैं और केवल उन्हें अपने आप को लागू करते हैं यदि आप काफी समय और संसाधनों को खर्च करने के लिए तैयार हैं। यह आम तौर पर तीसरे पक्ष के पुस्तकालयों या सेवाओं का उपयोग करने के लिए एक बेहतर विकल्प है जो आपके लिए उस भारी उठाने का काम करता है।

अंत में, ये प्रोटोकॉल बहुत सारे परिदृश्यों को कवर करते हैं इसलिए वे कुछ स्थितियों में ओवरकिल हो सकते हैं।


2
लिखित चेतावनी के बजाय निहित सावधानी और पूर्ण प्रश्न का उत्तर देने के लिए +1।
पॉल

3

मुझे नहीं लगता कि आपको एक चैनल की जरूरत है। आपके पेलोड में सर्वर द्वारा दी गई एक्सपायरी जानकारी हो सकती है (और अनुशंसित है)exp लॉगिन पर टोकन उत्पन्न होता है , कुंजी में, मानक के अनुसार ) । यदि एक समय सीमा समाप्त टोकन का उपयोग किया जाता है (जो, जाहिर है, सर्वर द्वारा निर्धारित किया जाता है, जो केवल इस बात पर भरोसा करता है कि हस्ताक्षर के सत्यापन के समय टोकन में क्या है), सर्वर बस इसे HTTP 401 के साथ खारिज कर देता है, क्लाइंट को फिर से प्रमाणित करने के लिए प्रेरित करता है।

इस बीच, ग्राहक सक्रिय हो सकते हैं। पेलोड अनुभाग एन्क्रिप्ट नहीं किया गया है, और जब से ग्राहक इसे पढ़ सकता है ग्राहक यह पता लगा सकता है कि एक अनुरोध कब समाप्त टोकन के साथ भेजा जाएगा, और इसलिए कॉल करें/login फिर से करें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.