रेस्टफुल ऑथेंटिकेशन का क्या मतलब है और यह कैसे काम करता है? मुझे Google पर एक अच्छा अवलोकन नहीं मिल रहा है। मेरी एकमात्र समझ यह है कि आप URL में सत्र कुंजी (रीमर्बल) पास करते हैं, लेकिन यह बहुत गलत हो सकता है।
रेस्टफुल ऑथेंटिकेशन का क्या मतलब है और यह कैसे काम करता है? मुझे Google पर एक अच्छा अवलोकन नहीं मिल रहा है। मेरी एकमात्र समझ यह है कि आप URL में सत्र कुंजी (रीमर्बल) पास करते हैं, लेकिन यह बहुत गलत हो सकता है।
जवाबों:
कैसे एक विश्वसनीय क्लाइंट-सर्वर आर्किटेक्चर में प्रमाणीकरण को संभालना बहस का विषय है।
आमतौर पर, इसे HTTP दुनिया में SOA के माध्यम से प्राप्त किया जा सकता है:
आपको अपने सॉफ़्टवेयर आर्किटेक्चर को सर्वोत्तम रूप से मिलान करने के लिए उन तकनीकों को अनुकूलित करना होगा, या उससे भी बेहतर मिश्रण करना होगा।
आपकी सुरक्षा नीति और सॉफ़्टवेयर आर्किटेक्चर के उद्देश्य के आधार पर प्रत्येक प्रमाणीकरण योजना के अपने PRO और CONs हैं।
एचटीटीपीएस पर एचटीटीपी मूल आधार
यह पहला समाधान, मानक HTTPS प्रोटोकॉल पर आधारित है, जिसका उपयोग अधिकांश वेब सेवाओं द्वारा किया जाता है।
GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
इसे लागू करना आसान है, सभी ब्राउज़रों पर डिफ़ॉल्ट रूप से उपलब्ध है, लेकिन इसमें कुछ ज्ञात कमियां हैं, जैसे ब्राउज़र पर प्रदर्शित भयानक प्रमाणीकरण विंडो, जो बनी रहेगी (यहाँ कोई लॉगऑउट जैसी सुविधा नहीं है), कुछ सर्वर-साइड अतिरिक्त सीपीयू खपत, और तथ्य यह है कि उपयोगकर्ता-नाम और पासवर्ड को सर्वर में (HTTPS से अधिक) प्रसारित किया जाता है (यह कीबोर्ड की प्रविष्टि के दौरान केवल क्लाइंट साइड पर पासवर्ड को रहने देने के लिए अधिक सुरक्षित होना चाहिए, और सर्वर पर सुरक्षित हैश के रूप में संग्रहीत किया जाना चाहिए) ।
हम डाइजेस्ट ऑथेंटिकेशन का उपयोग कर सकते हैं , लेकिन इसके लिए HTTPS की भी आवश्यकता होती है, क्योंकि यह MiM या रिप्ले हमलों के लिए असुरक्षित है , और HTTP के लिए विशिष्ट है।
कुकीज़ के माध्यम से सत्र
ईमानदार होने के लिए, सर्वर पर प्रबंधित एक सत्र वास्तव में स्टेटलेस नहीं है।
एक संभावना कुकी सामग्री के भीतर सभी डेटा को बनाए रखने की हो सकती है। और, डिज़ाइन के अनुसार, कुकी को सर्वर साइड में संभाला जाता है (क्लाइंट, वास्तव में, इस कुकी डेटा की व्याख्या करने की कोशिश भी नहीं करता है: यह बस प्रत्येक क्रमिक अनुरोध पर सर्वर को वापस सौंप देता है)। लेकिन यह कुकी डेटा एप्लिकेशन स्टेट डेटा है, इसलिए क्लाइंट को शुद्ध स्टेटलेस दुनिया में सर्वर का प्रबंधन करना चाहिए, न कि सर्वर का।
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123
कुकी तकनीक स्वयं HTTP-लिंक्ड है, इसलिए यह वास्तव में RESTful नहीं है, जो प्रोटोकॉल-स्वतंत्र, IMHO होना चाहिए। यह MiM या रिप्ले हमलों के लिए असुरक्षित है ।
टोकन के माध्यम से दी गई (OAuth2)
एक विकल्प HTTP हेडर के भीतर एक टोकन डालना है ताकि अनुरोध प्रमाणित हो। यह क्या है OAuth 2.0 करता है, उदाहरण के लिए। RFC 6749 देखें :
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer mF_9.B5f-4.1JqM
संक्षेप में, यह कुकी के समान है और समान मुद्दों से ग्रस्त है: स्टेटलेस नहीं है, HTTP ट्रांसमिशन विवरण पर निर्भर है, और बहुत सारी सुरक्षा कमजोरियों के अधीन है - जिसमें MiM और रिप्ले भी शामिल हैं - इसलिए इसका उपयोग केवल HTTPS से अधिक किया जाना है। आमतौर पर, JWT को टोकन के रूप में उपयोग किया जाता है।
क्वेरी प्रमाणीकरण
क्वेरी प्रमाणीकरण यूआरआई पर कुछ अतिरिक्त मापदंडों के माध्यम से प्रत्येक रिस्टफुल अनुरोध पर हस्ताक्षर करने में शामिल है। इस संदर्भ लेख को देखें ।
इसे इस लेख में इस प्रकार परिभाषित किया गया था:
सभी REST क्वेरीज़ को निचले-मामले में क्रमबद्ध क्वेरी मापदंडों पर हस्ताक्षर करके प्रमाणित किया जाना चाहिए, हस्ताक्षरित टोकन के रूप में निजी क्रेडेंशियल का उपयोग करके वर्णानुक्रम। क्वेरी स्ट्रिंग को URL एन्कोडिंग करने से पहले हस्ताक्षर होना चाहिए।
यह तकनीक संभवतः स्टेटलेस आर्किटेक्चर के साथ अधिक संगत है, और इसे एक लाइट सत्र प्रबंधन (डीबी हठ के बजाय इन-मेमोरी सत्र का उपयोग करके) के साथ भी लागू किया जा सकता है।
उदाहरण के लिए, यहां ऊपर दिए गए लिंक से एक सामान्य यूआरआई नमूना है:
GET /object?apiKey=Qwerty2010
इस तरह प्रेषित किया जाना चाहिए:
GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789
हस्ताक्षर किए जा रहे स्ट्रिंग है /object?apikey=Qwerty2010×tamp=1261496500
और हस्ताक्षर API कुंजी के निजी घटक का उपयोग करके उस स्ट्रिंग का SHA256 हैश है।
सर्वर-साइड डेटा कैशिंग हमेशा उपलब्ध हो सकता है। उदाहरण के लिए, हमारे ढांचे में, हम SQL स्तर पर प्रतिक्रियाओं को कैश करते हैं, URI स्तर पर नहीं। इसलिए इस अतिरिक्त पैरामीटर को जोड़ने से कैश तंत्र नहीं टूटता।
JSON और REST पर आधारित हमारे क्लाइंट-सर्वर ORM / SOA / MVC फ्रेमवर्क में Restful प्रमाणीकरण के बारे में कुछ विवरणों के लिए यह लेख देखें । चूंकि हम न केवल HTTP / 1.1 पर संचार की अनुमति देते हैं, बल्कि पाइप या GDI संदेश (स्थानीय रूप से) का नाम भी देते हैं, हमने वास्तव में विश्वसनीय प्रमाणीकरण पैटर्न को लागू करने की कोशिश की, और HTTP विशिष्टता (जैसे हेडर या कुकीज़) पर भरोसा नहीं किया।
बाद में ध्यान दें : URI में एक हस्ताक्षर जोड़ने को बुरे अभ्यास के रूप में देखा जा सकता है (उदाहरण के लिए चूंकि यह http सर्वर लॉग में दिखाई देगा) इसलिए इसे रीप्ले से बचने के लिए उचित टीटीएल द्वारा शमन किया जाना चाहिए। लेकिन अगर आपके http लॉग्स से छेड़छाड़ की जाती है, तो आपको निश्चित रूप से बड़ी सुरक्षा समस्याएं होंगी।
व्यवहार में, OAuth 2.0 के लिए आगामी मैक टोकन प्रमाणीकरण "टोकन द्वारा" वर्तमान योजना के संबंध में एक बड़ा सुधार हो सकता है। लेकिन यह अभी भी एक कार्य प्रगति पर है और HTTP ट्रांसमिशन से जुड़ा हुआ है।
निष्कर्ष
यह निष्कर्ष के लायक है कि REST केवल HTTP- आधारित नहीं है, भले ही, व्यवहार में, यह ज्यादातर HTTP पर भी लागू होता है। REST अन्य संचार परतों का उपयोग कर सकता है। तो एक RESTful प्रमाणीकरण केवल HTTP प्रमाणीकरण का पर्याय नहीं है, जो भी Google उत्तर देता है। यह भी HTTP तंत्र का उपयोग नहीं करना चाहिए, लेकिन संचार परत से अमूर्त किया जाएगा। और यदि आप HTTP संचार का उपयोग करते हैं, तो लेट्स एनक्रिप्ट की पहल की बदौलत उचित HTTPS का उपयोग नहीं करने का कोई कारण नहीं है, जो किसी भी प्रमाणीकरण योजना के अतिरिक्त आवश्यक है।
Cookie
एक बेहतर प्रतिस्थापन के रूप में उपयोग HTTP Basic Auth
करते हैं, तो प्रमाणीकरण को समाप्त करने और लॉगआउट करने की क्षमता के लिए एक विधि के साथ वास्तव में स्टेटलेस प्रमाणीकरण कर सकते हैं। एक उदाहरण कार्यान्वयन Emulated-HTTP-Basic-Auth
वास्तविक HTTP बेसिक प्रमाणीकरण के लिए समान मूल्य के साथ बुलाया कुकी का उपयोग कर सकता है और इसके अतिरिक्त समय समाप्त हो सकता है। उस कुकी को हटाने के साथ लॉग आउट किया जा सकता है। मुझे लगता है कि HTTP बेसिक ऑथेंट को समर्थन देने में सक्षम कोई भी ग्राहक इस तरह से किए गए कुकी प्रमाणीकरण का समर्थन कर सकता है।
Cookie
) में उसी सामान के लिए एमुलेशन प्रदान करता है जिसका उपयोग किया जा सकता है।
मुझे संदेह है कि क्या लोगों ने उत्साह के साथ "HTTP प्रमाणीकरण" चिल्लाते हुए कभी भी REST के साथ एक ब्राउज़र-आधारित एप्लिकेशन (मशीन-टू-मशीन वेब सेवा के बजाय) बनाने की कोशिश की (कोई इरादा नहीं है - मुझे नहीं लगता कि उन्होंने कभी जटिलताओं का सामना किया है) ।
एक ब्राउज़र में देखे जाने वाले HTML पृष्ठों का निर्माण करने वाली पुरानी सेवाओं पर HTTP प्रमाणीकरण का उपयोग करने के साथ मुझे जो समस्याएं मिलीं, वे हैं:
एक बहुत ही आनंददायक लेख जो इन बिंदुओं को बिंदु से निपटाता है , लेकिन इसके परिणामस्वरूप बहुत सारे ब्राउज़र-विशिष्ट जावास्क्रिप्ट हैकरी, वर्कअराउंड के लिए वर्कआर्ट्स, वगैरह। जैसे, यह भी आगे-संगत नहीं है, इसलिए निरंतर रखरखाव की आवश्यकता होगी क्योंकि नए ब्राउज़र जारी किए जाते हैं। मैं उस साफ और स्पष्ट डिज़ाइन पर विचार नहीं करता, साथ ही मुझे लगता है कि यह बहुत अतिरिक्त काम और सिरदर्द है, ताकि मैं अपने दोस्तों को उत्साहपूर्वक अपना REST-बैज दिखा सकूं।
मेरा मानना है कि कुकीज़ समाधान हैं। लेकिन रुको, कुकीज़ बुराई हैं, वे नहीं हैं? नहीं, वे नहीं हैं, जिस तरह से कुकीज़ का उपयोग अक्सर किया जाता है वह बुराई है। कुकी स्वयं ही क्लाइंट-साइड जानकारी का एक टुकड़ा है, जैसे HTTP प्रमाणीकरण की जानकारी है कि ब्राउज करते समय ब्राउज़र ट्रैक रखेगा। और क्लाइंट-साइड जानकारी का यह टुकड़ा हर अनुरोध पर सर्वर को भेजा जाता है, फिर से HTTP प्रमाणीकरण जानकारी की तरह ही होगा। वैचारिक रूप से, एकमात्र अंतर यह है कि क्लाइंट-साइड स्टेट के इस टुकड़े की सामग्री को सर्वर द्वारा इसकी प्रतिक्रिया के भाग के रूप में निर्धारित किया जा सकता है ।
सत्रों को केवल निम्नलिखित नियमों के साथ एक समृद्ध संसाधन बनाकर:
HTTP प्रमाणीकरण के लिए एकमात्र अंतर, अब, यह है कि प्रमाणीकरण कुंजी सर्वर द्वारा उत्पन्न की जाती है और क्लाइंट को भेजी जाती है जो इसे दर्ज किए गए क्रेडेंशियल्स से कंप्यूटिंग के बजाय क्लाइंट को वापस भेजती रहती है।
Converter42 जोड़ता है कि https (जिसका उपयोग हमें करना चाहिए) का उपयोग करते समय, यह महत्वपूर्ण है कि कुकी का अपना सुरक्षित ध्वज सेट होगा ताकि प्रमाणीकरण जानकारी कभी भी गैर-सुरक्षित कनेक्शन पर न भेजी जाए। महान बिंदु, इसे खुद नहीं देखा था।
मुझे लगता है कि यह एक पर्याप्त समाधान है जो ठीक काम करता है, लेकिन मुझे यह स्वीकार करना चाहिए कि मैं इस योजना में संभावित छिद्रों की पहचान करने के लिए एक सुरक्षा विशेषज्ञ के लिए पर्याप्त नहीं हूं - मुझे पता है कि सैकड़ों गैर-उत्साही वेब अनुप्रयोग अनिवार्य रूप से समान का उपयोग करते हैं लॉगिन प्रोटोकॉल (PHP में $ _SESSION, जावा ईई में HttpSession, आदि)। कुकी हेडर सामग्री का उपयोग केवल सर्वर-साइड संसाधन को संबोधित करने के लिए किया जाता है, जैसे अनुवाद-संसाधनों तक पहुंचने के लिए एक स्वीकार-भाषा का उपयोग किया जा सकता है, आदि। मुझे लगता है कि यह वही है, लेकिन शायद दूसरों को नहीं? तुम लोग क्या सोचते हो?
यहाँ पहले से ही अच्छे लोगों द्वारा इस विषय पर पहले से ही कहा गया है। लेकिन यहाँ मेरे 2 सेंट है।
बातचीत के 2 तरीके हैं:
मशीन सामान्य भाजक है, जिसे REST API के रूप में व्यक्त किया जाता है, और अभिनेता / ग्राहक या तो मनुष्य या मशीन होते हैं।
अब, वास्तव में एक प्रतिष्ठित वास्तुकला में, स्टेटलेसनेस की अवधारणा का अर्थ है कि सभी प्रासंगिक एप्लिकेशन स्टेट्स (मतलब क्लाइंट साइड स्टेट्स) को प्रत्येक अनुरोध के साथ आपूर्ति की जानी चाहिए। प्रासंगिक रूप से, इसका अर्थ है कि अनुरोध को संसाधित करने और एक उपयुक्त प्रतिक्रिया देने के लिए REST API द्वारा जो कुछ भी आवश्यक है।
जब हम मानव-टू-मशीन अनुप्रयोगों के संदर्भ में इस पर विचार करते हैं, तो "ब्राउज़र-आधारित" जैसा कि Skrebbel ऊपर इंगित करता है, इसका मतलब है कि ब्राउज़र में चल रहे वेब (वेब) एप्लिकेशन को प्रत्येक अनुरोध के साथ अपने राज्य और प्रासंगिक जानकारी भेजने की आवश्यकता होगी यह बैकस्ट REST API को बनाता है।
इस पर विचार करें: आपके पास REST API की संपत्ति / सूचना प्लेटफ़ॉर्म उजागर है। शायद आपके पास एक स्वयं-सेवा बीआई प्लेटफॉर्म है जो सभी डेटा क्यूब्स को संभालता है। लेकिन आप चाहते हैं कि आपके (मानव) ग्राहक इसे (1) वेब ऐप, (2) मोबाइल ऐप और (3) कुछ तृतीय पक्ष एप्लिकेशन के माध्यम से एक्सेस करें। अंत में, एमटीएम की भी श्रृंखला एचटीएम तक जाती है - सही। इसलिए मानव उपयोगकर्ता सूचना श्रृंखला के शीर्ष पर बने हुए हैं।
पहले 2 मामलों में, आपके पास मानव-से-मशीन इंटरैक्शन के लिए एक मामला है, वास्तव में मानव उपयोगकर्ता द्वारा खपत की जा रही जानकारी। अंतिम स्थिति में, आपके पास REST API का उपभोग करने वाला एक मशीन प्रोग्राम है।
प्रमाणीकरण की अवधारणा बोर्ड भर में लागू होती है। आप इसे कैसे डिज़ाइन करेंगे ताकि आपके REST API को एक समान, सुरक्षित तरीके से एक्सेस किया जा सके? जिस तरह से मैं इसे देखता हूं, इसके 2 तरीके हैं:
मार्ग-1:
मार्ग-2:
स्पष्ट रूप से, Way-2 में, REST API को टोकन को मान्य मानने और उस पर भरोसा करने का एक तरीका होगा। लॉग इन एपीआई ने सत्यापन का प्रदर्शन किया, और इसलिए कि "वॉलेट कुंजी" को आपके कैटलॉग में अन्य रीस्ट एपीआई द्वारा भरोसा किया जाना चाहिए।
यह निश्चित रूप से, इसका मतलब है कि आरईएस एपीआई के बीच ऑर्टिकल की / टोकन को संग्रहीत और साझा करना होगा। यह साझा, विश्वसनीय टोकन रिपॉजिटरी स्थानीय / फेडरेटेड हो सकता है जो भी हो, अन्य संगठनों के REST API को एक दूसरे पर भरोसा करने की अनुमति देता है।
लेकिन मैं पीछे हटा।
मुद्दा यह है, एक "राज्य" (ग्राहक की प्रामाणिक स्थिति के बारे में) को बनाए रखने और साझा करने की आवश्यकता है ताकि सभी रीस्ट एपीआई विश्वास का एक चक्र बना सकें। यदि हम ऐसा नहीं करते हैं, जो कि मार्ग -1 है, तो हमें यह स्वीकार करना चाहिए कि किसी भी / सभी अनुरोधों के प्रमाणीकरण का कार्य किया जाना चाहिए।
प्रमाणीकरण करना एक संसाधन-गहन प्रक्रिया है। UID / pwd मैच की जांच करने के लिए अपने उपयोगकर्ता स्टोर के खिलाफ, आने वाले अनुरोध के लिए, SQL क्वेरी को निष्पादित करने की कल्पना करें। या, हैश मैचों (AWS शैली) को एन्क्रिप्ट और प्रदर्शन करने के लिए। और वास्तुशिल्प रूप से, प्रत्येक REST API को यह करने की आवश्यकता होगी, मुझे संदेह है, एक सामान्य बैक-एंड लॉगिन सेवा का उपयोग करके। क्योंकि, यदि आप ऐसा नहीं करते हैं, तो आप हर जगह स्थिती कोड को लिट कर जाते हैं। बड़ी गड़बड़ी।
तो अधिक परतें, अधिक विलंबता।
अब, Way-1 लें और HTM पर लागू करें। क्या आपके (मानव) उपयोगकर्ता को वास्तव में परवाह है अगर आपको हर अनुरोध के साथ uid / pwd / हैश या जो भी भेजना है? नहीं, जब तक कि आप उसे हर सेकंड में ऑर्टिकल / लॉगइन पेज फेंककर परेशान नहीं करते। अगर आप करते हैं तो ग्राहकों का सौभाग्य। इसलिए, आप जो भी करेंगे, वह क्लाइंट की ओर से कहीं न कहीं, लॉगिन जानकारी को स्टोर करने के लिए है, शुरुआत में, और इसे हर अनुरोध के साथ भेजें। (मानव) उपयोगकर्ता के लिए, वह पहले ही लॉग इन कर चुकी है और एक "सत्र" उपलब्ध है। लेकिन वास्तव में, वह हर अनुरोध पर प्रमाणित होता है।
वे -2 के साथ भी। आपका (मानव) उपयोगकर्ता कभी नोटिस नहीं करेगा। इसलिए कोई नुकसान नहीं हुआ।
अगर हम MTM के लिए Way-1 लागू करते हैं तो क्या होगा? इस मामले में, इसकी मशीन के बाद से, हम हर अनुरोध के साथ प्रमाणीकरण जानकारी सबमिट करके पूछकर इस आदमी को नरक से बाहर निकाल सकते हैं। किसी को परवाह नहीं! MTM पर Way-2 का प्रदर्शन कोई विशेष प्रतिक्रिया नहीं देगा; यह एक लानत मशीन है। यह कम देखभाल कर सकता है!
तो वास्तव में, सवाल यह है कि आपकी आवश्यकता के अनुरूप क्या है। स्टेटलेसनेस को भुगतान करने की कीमत होती है। कीमत चुकाएं और आगे बढ़ें। यदि आप एक शुद्धतावादी बनना चाहते हैं, तो उसके लिए भी कीमत चुकाएं, और आगे बढ़ें।
अंत में, दर्शन कोई मायने नहीं रखते। क्या वास्तव में मायने रखता है जानकारी की खोज, प्रस्तुति, और खपत अनुभव। यदि लोग आपके API से प्यार करते हैं, तो आपने अपना काम किया है।
Way-3
, संकर दृष्टिकोण। क्लाइंट लॉग इन करता है, Way-2
लेकिन जैसा कि Way-1
, किसी भी सर्वर साइड स्टेट के खिलाफ क्रेडेंशियल्स की जांच नहीं की जाती है। बावजूद, एक टोकन बनाया जाता है और क्लाइंट को वापस भेजा जाता है Way-2
। इस टोकन को बाद में किसी भी ग्राहक विशिष्ट स्थिति को देखने के साथ असममित क्रिप्टो का उपयोग करके प्रामाणिकता के लिए जाँच की जाती है।
यहाँ एक सही और पूरी तरह से विश्वसनीय प्रमाणीकरण समाधान है:
जब एक ग्राहक प्रमाणित करता है:
3.1। एक टोकन जारी करें जिसमें निम्नलिखित शामिल हैं:
3.2। निजी कुंजी के साथ टोकन को एन्क्रिप्ट करें।
3.3। उपयोगकर्ता को एन्क्रिप्टेड टोकन वापस भेजें।
जब उपयोगकर्ता किसी भी एपीआई का उपयोग करता है, तो उन्हें अपने टोकन में पास होना चाहिए।
यह स्टेटलेस / रेस्टफुल ऑथेंटिकेशन है।
ध्यान दें, यदि एक पासवर्ड हैश शामिल किया गया था तो उपयोगकर्ता प्रमाणीकरण टोकन के साथ अनएन्क्रिप्टेड पासवर्ड भी भेजेगा। सर्वर सत्यापित कर सकता है कि पासवर्ड उस पासवर्ड से मेल खाता है जिसका उपयोग हैश की तुलना करके प्रमाणीकरण टोकन बनाने के लिए किया गया था। HTTPS जैसी किसी चीज का उपयोग करने वाला एक सुरक्षित कनेक्शन आवश्यक होगा। क्लाइंट साइड पर जावास्क्रिप्ट उपयोगकर्ता के पासवर्ड को प्राप्त करने और इसे क्लाइंट साइड स्टोर करने में सक्षम कर सकता है, या तो मेमोरी में या कुकी में, संभवतः सर्वर की सार्वजनिक कुंजी के साथ एन्क्रिप्ट किया गया हो ।
आपके साथ ईमानदार होने के लिए मैंने यहाँ बहुत अच्छे उत्तर देखे हैं, लेकिन कुछ ऐसा है जो मुझे थोड़ा परेशान करता है, जब कोई व्यक्ति पूरे स्टेटलेस कॉन्सेप्ट को चरम पर ले जाएगा, जहाँ वह हठधर्मी हो जाता है। यह मुझे उन पुराने स्मॉलटॉक प्रशंसकों की याद दिलाता है जो केवल शुद्ध ओओ को गले लगाना चाहते थे और यदि कोई वस्तु नहीं है, तो आप गलत कर रहे हैं। मुझे एक विराम दें।
Restful दृष्टिकोण आपके जीवन को आसान बनाने और सत्रों की ओवरहेड और लागत को कम करने के लिए माना जाता है, इसका पालन करने की कोशिश करें क्योंकि यह करने के लिए एक बुद्धिमानी है, लेकिन जिस मिनट आप एक अनुशासन (किसी भी अनुशासन / दिशानिर्देश) का पालन करते हैं, जहां यह चरम होता है अब वह लाभ प्रदान नहीं करता है जिसका वह उद्देश्य था, तो आप इसे गलत कर रहे हैं। आज की कुछ सर्वश्रेष्ठ भाषाओं में कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेशन दोनों हैं।
यदि आपकी समस्या को हल करने का सबसे आसान तरीका है कि आप प्रमाणीकरण कुंजी को कुकी में संग्रहीत करें और इसे HTTP शीर्ष लेख पर भेजें, तो इसे करें, बस इसका दुरुपयोग न करें। याद रखें कि जब वे भारी और बड़े हो जाते हैं तो सत्र खराब होते हैं, यदि आपके सभी सत्रों में एक छोटी स्ट्रिंग होती है जिसमें एक कुंजी होती है, तो बड़ी बात क्या है?
मैं टिप्पणियों में सुधारों को स्वीकार करने के लिए खुला हूं, लेकिन मैं सिर्फ अपने सर्वर में हैश के एक बड़े शब्दकोश को रखने से बचने के लिए अपने जीवन को दुखी करने में बिंदु (अभी तक) नहीं देखता हूं।
सबसे पहले और सबसे महत्वपूर्ण, एक पुरानी वेब सेवा स्थिति है (या दूसरे शब्दों में, बिना किसी कारण के))। इसलिए, एक RESTful सेवा में सत्र या कुकी शामिल होने की अवधारणा नहीं होनी चाहिए। Restful सेवा में प्रमाणीकरण या प्राधिकरण करने का तरीका HTTP प्राधिकरण शीर्ष लेख का उपयोग करके किया गया है जैसा कि RFC 2616 HTTP विशिष्टताओं में परिभाषित किया गया है। हर एक अनुरोध में HTTP प्राधिकरण शीर्षक होना चाहिए, और अनुरोध को HTTP (SSL) कनेक्शन पर भेजा जाना चाहिए। यह सही तरीका है प्रमाणीकरण करने और HTTP रेस्टफुल वेब सेवाओं में अनुरोधों के प्रमाणीकरण को सत्यापित करने के लिए। मैंने सिस्को सिस्टम पर सिस्को PRIME परफॉर्मेंस मैनेजर एप्लिकेशन के लिए एक RESTful वेब सेवा को लागू किया है। और उस वेब सेवा के हिस्से के रूप में, मैंने प्रमाणीकरण / प्राधिकरण को भी लागू किया है।
यह निश्चित रूप से "सत्र कुंजियों" के बारे में नहीं है क्योंकि इसका उपयोग आम तौर पर सत्रहीन प्रमाणीकरण को संदर्भित करने के लिए किया जाता है जो कि आरईएसटी के सभी बाधाओं के भीतर किया जाता है। प्रत्येक अनुरोध स्वयं वर्णन करने योग्य है, बिना किसी सर्वर-साइड एप्लिकेशन स्थिति के अनुरोध को अधिकृत करने के लिए पर्याप्त जानकारी ले रहा है।
इसका सबसे आसान तरीका है RFC 2617 में HTTP के अंतर्निहित प्रमाणीकरण तंत्र के साथ शुरू करना ।
@Skrebel ( http://www.berenddeboer.net/rest/authentication.html ) द्वारा उल्लिखित The बहुत ही आनंददायक ’लेख प्रमाणीकरण के एक जटिल लेकिन वास्तव में टूटी हुई विधि पर चर्चा करता है।
आप पृष्ठ पर जाने का प्रयास कर सकते हैं (जो केवल प्रमाणित उपयोगकर्ता के लिए देखा जा सकता है) http://www.berenddeboer.net/rest/site/authenticated.html बिना किसी लॉगिन क्रेडेंशियल के।
(क्षमा करें, मैं उत्तर पर टिप्पणी नहीं कर सकता।)
मैं कहूंगा कि REST और ऑथेंटिकेशन बस मिक्स नहीं हैं। REST का अर्थ है स्टेटलेस लेकिन 'प्रमाणित' एक अवस्था है। आप उन दोनों को एक ही परत पर नहीं रख सकते। यदि आप एक उत्साही अधिवक्ता हैं और राज्यों पर ध्यान केंद्रित करते हैं, तो आपको HTTPS के साथ जाना होगा (यानी सुरक्षा समस्या को किसी अन्य परत पर छोड़ दें)।
मुझे लगता है कि बाकी के प्रमाणीकरण में अनुरोध में एक पैरामीटर के रूप में एक प्रमाणीकरण टोकन पारित करना शामिल है। उदाहरण api द्वारा apikeys का उपयोग कर रहे हैं। मेरा मानना है कि कुकीज़ का उपयोग या http योग्यता योग्य नहीं है।
नीचे उल्लिखित दृष्टिकोण अनिवार्य रूप से OAuth2.0 का "रिसोर्स ओनर पासवर्ड क्रेडेंशियल" अनुदान प्रकार है । यह उठने और भागने का एक आसान तरीका है। हालांकि, इस दृष्टिकोण के साथ संगठन में प्रत्येक एप्लिकेशन अपने स्वयं के प्रमाणीकरण और प्राधिकरण तंत्र के साथ समाप्त हो जाएगा। अनुशंसित दृष्टिकोण "प्राधिकरण कोड" अनुदान प्रकार है। इसके अतिरिक्त, नीचे दिए गए मेरे पहले के उत्तर में मैंने ब्राउज़र लोकलस्टोर को एंडर टोकन के भंडारण के लिए सुझाया था। हालांकि, मुझे विश्वास है कि कुकी इस उद्देश्य के लिए सही विकल्प है। मेरे पास इस स्टैकऑवरफ्लो उत्तर में मेरे कारण, प्राधिकरण कोड अनुदान प्रकार कार्यान्वयन दृष्टिकोण, सुरक्षा विचार आदि विस्तृत हैं ।
मुझे लगता है कि निम्नलिखित दृष्टिकोण का उपयोग REST सेवा प्रमाणीकरण के लिए किया जा सकता है:
इस दृष्टिकोण के साथ हम प्रत्येक 30 मिनट में उपयोगकर्ता के विशिष्ट पहुंच अधिकार के साथ कैश लोड करने का महंगा संचालन कर रहे हैं। इसलिए यदि कोई पहुँच निरस्त कर दी जाती है या नई पहुँच दी जाती है, तो उसे प्रतिबिंबित करने के लिए 30 मिनट लगते हैं या लॉगिन के बाद लॉगआउट होता है।
ऐसा करने का तरीका है: लॉगिन के लिए OAuth 2.0 का उपयोग करना ।
आप अन्य प्रमाणीकरण विधियों का उपयोग तब कर सकते हैं जब तक Google OAuth का समर्थन करता है।
एक सार्वजनिक कुंजी घुसपैठ का उपयोग करना जिसमें एक कुंजी के पंजीकरण में उचित बंधन शामिल होता है, यह सुनिश्चित करता है कि सार्वजनिक कुंजी उस व्यक्ति के लिए बाध्य है जिसे इसे इस तरह से सौंपा गया है जो गैर-प्रतिपूर्ति सुनिश्चित करता है
Http://en.wikipedia.org/wiki/Public_key_infrastructure देखें । यदि आप उचित पीकेआई मानकों का पालन करते हैं, तो चोरी की हुई चाबी का अनुचित उपयोग करने वाले व्यक्ति या एजेंट को पहचाना और लॉक किया जा सकता है। यदि एजेंट को प्रमाण पत्र का उपयोग करना आवश्यक है, तो बंधन बहुत तंग हो जाता है। एक चतुर और तेज-तर्रार चोर बच सकता है, लेकिन वे अधिक टुकड़ों को छोड़ देते हैं।
मेरी समझ से इस सवाल का जवाब देने के लिए ...
एक प्रमाणीकरण प्रणाली जो REST का उपयोग करती है ताकि आपको अपने सिस्टम में उपयोगकर्ताओं को वास्तव में ट्रैक या प्रबंधित करने की आवश्यकता न हो। यह HTTP तरीकों POST, GET, PUT, DELETE का उपयोग करके किया जाता है। हम इन 4 तरीकों को लेते हैं और डेटाबेस इंटरैक्शन के संदर्भ में उनके बारे में सोचते हैं, जैसे कि, READ, UPDATE, DELETE (लेकिन वेब पर हम POST और GET का उपयोग करते हैं क्योंकि वर्तमान में जो एंकर टैग सपोर्ट करते हैं)। इसलिए POST और GET को हमारे CREATE / READ / UPDATE / DELETE (CRUD) के रूप में माना जाता है, तब हम अपने वेब एप्लिकेशन में मार्गों को डिज़ाइन कर सकते हैं जो सीआरयूडी की कार्रवाई को प्राप्त करने में सक्षम होंगे।
उदाहरण के लिए, रूबी ऑन रेल एप्लिकेशन में हम अपने वेब ऐप का निर्माण कर सकते हैं जैसे कि अगर कोई उपयोगकर्ता जो http://store.com/account/logout में लॉग इन है तो उस पेज का GET लॉगआउट करने का प्रयास करने वाले उपयोगकर्ता के रूप में देखा जा सकता है । हमारे रेल कंट्रोलर में हम उस एक्शन को बनाते हैं जो यूजर को लॉग आउट करता है और होम पेज पर वापस भेज देता है।
प्रवेश पृष्ठ पर एक GET एक फार्म प्राप्त होगा। लॉगिन पृष्ठ पर एक POST को एक लॉगिन प्रयास के रूप में देखा जाएगा और POST डेटा ले और इसे लॉगिन करने के लिए उपयोग करें।
मेरे लिए, यह उनके डेटाबेस अर्थ के लिए मैप किए गए HTTP तरीकों का उपयोग करने और फिर उस के साथ एक प्रमाणीकरण प्रणाली बनाने का अभ्यास है जिसे ध्यान में रखते हुए आपको किसी भी सत्र आईडी या ट्रैक सत्र से गुजरने की आवश्यकता नहीं है।
मैं अभी भी सीख रहा हूं - अगर आपको कुछ भी मिला है तो मैंने कहा है कि कृपया मुझे सही करें, और यदि आप अधिक पोस्ट सीखते हैं तो इसे यहां वापस करें। धन्यवाद।
किसी भी वेब एप्लिकेशन को सुरक्षित करने के लिए मान्य टिप्स
यदि आप अपने एप्लिकेशन को सुरक्षित करना चाहते हैं, तो आपको निश्चित रूप से HTTP के बजाय HTTPS का उपयोग करके शुरू करना चाहिए , यह आपके और उपयोगकर्ताओं के बीच एक सुरक्षित चैनल बनाना सुनिश्चित करता है जो उपयोगकर्ताओं को भेजे गए डेटा को वापस सूँघने से रोकेगा और डेटा को बनाए रखने में मदद करेगा। विनिमय गोपनीय।
Restful API को सुरक्षित करने के लिए आप JWTs (JSON वेब कैम) का उपयोग कर सकते हैं , सर्वर-साइड सत्र की तुलना में इसके कई लाभ हैं, लाभ मुख्य रूप से हैं:
1- अधिक स्केलेबल, चूंकि आपके एपीआई सर्वर को प्रत्येक उपयोगकर्ता के लिए सत्र नहीं बनाए रखने होंगे (जो आपके कई सत्र होने पर बड़ा बोझ हो सकता है)
2- JWT स्वयं सम्मिलित हैं और उन दावों को कहते हैं जो उदाहरण के लिए उपयोगकर्ता की भूमिका को परिभाषित करते हैं और वह तिथि और समाप्ति की तारीख तक पहुंच और जारी कर सकते हैं (जिसके बाद JWT मान्य नहीं होगा)
3- लोड-बैलेन्सर को हैंडल करना आसान है और यदि आपके पास कई एपीआई सर्वर हैं क्योंकि आपको सत्र डेटा साझा करने की आवश्यकता नहीं होगी और न ही सत्र को उसी सर्वर पर भेजने के लिए सर्वर को कॉन्फ़िगर करना होगा, जब भी JWT के साथ किसी भी सर्वर को हिट करने का अनुरोध किया जाता है तो इसे प्रमाणित किया जा सकता है & अधिकार दिया गया
4- आपके DB पर कम दबाव और साथ ही आपको प्रत्येक अनुरोध के लिए सत्र आईडी और डेटा को लगातार संग्रहीत और पुनर्प्राप्त नहीं करना होगा
5- JWT के साथ छेड़छाड़ नहीं की जा सकती है यदि आप JWT पर हस्ताक्षर करने के लिए एक मजबूत कुंजी का उपयोग करते हैं, तो आप JWT में उन दावों पर भरोसा कर सकते हैं जो उपयोगकर्ता सत्र की जांच किए बिना अनुरोध के साथ भेजे गए हैं और वह अधिकृत है या नहीं। , आप बस JWT की जांच कर सकते हैं और फिर आप यह जानने के लिए पूरी तरह तैयार हैं कि यह उपयोगकर्ता कौन और क्या कर सकता है।
कई पुस्तकालय अधिकांश प्रोग्रामिंग भाषाओं में JWTs बनाने और मान्य करने के लिए आसान तरीके प्रदान करते हैं, उदाहरण के लिए: नोड में। सबसे लोकप्रिय में से एक है jsonwebtoken
चूंकि REST API का उद्देश्य आमतौर पर सर्वर को स्टेटलेस रखना होता है, इसलिए JWT उस कॉन्सेप्ट के साथ अधिक संगत होते हैं क्योंकि प्रत्येक अनुरोध को प्राधिकरण टोकन के साथ भेजा जाता है जो स्वयं निहित होता है (JWT) सर्वर के बिना सेशन की तुलना में यूजर सेशन का ट्रैक रखने के लिए होता है, जो सत्र बनाते हैं सर्वर स्टेटफुल है ताकि यह उपयोगकर्ता और उसकी भूमिका को याद रखे, हालांकि, सत्रों का भी व्यापक रूप से उपयोग किया जाता है और उनके पेशेवरों के पास हैं, जिन्हें आप चाहें तो खोज सकते हैं।
एक महत्वपूर्ण बात यह है कि आपको HTTPS का उपयोग करके क्लाइंट को JWT को सुरक्षित रूप से डिलीवर करना होगा और इसे सुरक्षित स्थान पर सहेजना होगा (उदाहरण के लिए स्थानीय भंडारण में)।
आप इस लिंक से JWTs के बारे में अधिक जान सकते हैं