हम माइक्रोसर्विस आर्किटेक्चर में उपयोगकर्ताओं को अधिकृत करने का सबसे अच्छा तरीका निर्धारित करने की कोशिश कर रहे हैं, जबकि यह सुनिश्चित करना कि माइक्रोसेवा को सीमित अनुमति है। हमारी वास्तुकला JWT टोकन जारी करने से निपटने के लिए एक केंद्रीय प्राधिकरण सेवा का उपयोग करती है।
हमारी निम्नलिखित आवश्यकताएँ हैं:
उपयोगकर्ताओं को कुछ भूमिकाएं निभाने के लिए सीमित होना चाहिए। उदाहरण के लिए, एक उपयोगकर्ता को केवल उस सामग्री को बनाने / संशोधित करने / पढ़ने में सक्षम होना चाहिए जो वह स्वयं करता है।
माइक्रोसर्विसेज को केवल उन अनुमतियों तक सीमित होना चाहिए जिनकी उन्हें आवश्यकता है। उदाहरण के लिए, एक माइक्रोसेवा जिसे केवल किसी अन्य सेवा से डेटा पढ़ने की आवश्यकता है, उस सेवा में डेटा लिखने से स्पष्ट रूप से मना किया जाना चाहिए।
एक उदाहरण के रूप में, मान लें कि हमारे पास एक प्रणाली है जहां उपयोगकर्ता चित्र को एक छवि स्टोर सेवा पर अपलोड कर सकते हैं। हमारे पास एक टैगिंग सेवा है जो स्वचालित रूप से किसी स्थान के साथ चित्रों को टैग करती है। उपयोगकर्ता केवल अपने स्वयं के चित्र CRUD कर सकते हैं। टैगिंग सेवा छवि स्टोर सेवा से किसी भी छवि को पढ़ सकती है, हालांकि संशोधित / हटाने में सक्षम नहीं होना चाहिए।
JWT टोकन का उपयोग करके उपरोक्त प्राप्त करने का एक अच्छा तरीका क्या है? कुछ समाधान जिनके बारे में हमने चर्चा की है वे हैं:
छवि स्टोर सेवा 2 एपीआई को उजागर करती है, एक जो बाहरी रूप से उपलब्ध है (उपयोगकर्ता सीआरयूडी एक्सेस दे रही है), और एक जो आंतरिक रूप से उपलब्ध है (आंतरिक रीड-ओनली एक्सेस दे रही है)। अनम्य लगता है - क्या होगा यदि किसी अन्य आंतरिक सेवा को सभी छवियों तक पढ़ने / लिखने की आवश्यकता होती है (उदाहरण के लिए जो स्वचालित रूप से स्पष्ट छवियों को हटाता है)?
हम उपयोगकर्ता की JWT में दो अनुमतियाँ सेट करते हैं, जिनमें से एक CRUD_OwnImages है, दूसरा READ_ForAnalysis है। टैगिंग सेवा यह देख सकती है कि क्या उपयोगकर्ता के पास READ_ForAnalysis अनुमतियाँ हैं, और यदि ऐसा है, तो उचित अनुरोध करें। हमारे पास एक और माइक्रोसेवा है जो यह देखने के लिए जांचता है कि उपयोगकर्ता के स्वयं के चित्रों पर CRUD संचालन के लिए उपयोगकर्ता के पास CRUD_OwnImages है या नहीं। यह सुनिश्चित करने के लिए प्रत्येक माइक्रो-सर्विस पर जिम्मेदारी डालता है कि उपयोगकर्ता को उन कार्यों के लिए प्रतिबंधित किया जाता है जिनकी उसे आवश्यकता होती है। छवि की दुकान में इस दृष्टिकोण के साथ प्रत्येक माइक्रोसिस्ट को प्रतिबंधित करने का कोई तरीका नहीं है, इसलिए यह संभावित रूप से परतदार और त्रुटि प्रवण है।
हम अनुमति के रूप में READ_ForAnalysis के साथ टैगिंग माइक्रोसिस्ट को अपना उपयोगकर्ता देते हैं। फिर, जब टैगिंग सेवा छवि स्टोर से छवियों का अनुरोध करती है, तो इसे उन तक पहुंच दी जाती है, लेकिन उन्हें संशोधित करने से मना किया जाता है। उपयोगकर्ता के उपयोगकर्ता के पास केवल CRUD_OwnImages अनुमति है, इसलिए वह दृश्यपटल से केवल अपनी छवियों को पुनर्प्राप्त और प्राप्त करने में सक्षम है। यदि किसी अन्य सेवा को सभी डेटा के लिए CRUD की आवश्यकता है, तो हम इसे CRUD_AllData या समान दे सकते हैं। हम इस दृष्टिकोण को पसंद करते हैं क्योंकि प्रत्येक सेवा अब अपने स्वयं के डेटा (उस तर्क के बजाय कई सेवाओं में दोहराई जा रही है) के लिए ज़िम्मेदार है, लेकिन क्या होगा यदि सेवा को उपयोगकर्ता की अनुमति और माइक्रोसर्विस दोनों अनुमतियों की आवश्यकता हो? क्या हम सुरक्षित रूप से दो JWT टोकन (उपयोगकर्ता और microservice दोनों) भेज सकते हैं? क्या अनुमतियों को सुरक्षित रूप से संयोजित करने और उस माध्यम से भेजने का कोई तरीका है? जैसे
यदि उपयोगकर्ता जानकारी को और नीचे की ओर (2 या 3 माइक्रोसेवर्सर) की आवश्यकता होती है, तो समस्या समाप्त हो जाती है। क्या हम केवल यह मान लेते हैं कि यह व्यक्तिगत माइक्रोसर्विसेज पर निर्भर है कि वे अपने आप को उन कार्यों तक सीमित कर सकें जिनकी उन्हें आवश्यकता है, और यह स्पष्ट नहीं है?