क्या आप मुझे यह समझने में मदद कर सकते हैं? "आम बाकी गलतियाँ: सत्र अप्रासंगिक हैं"


159

अस्वीकरण: मैं विचार के REST स्कूल में नया हूं, और मैं अपने दिमाग को इसके चारों ओर लपेटने की कोशिश कर रहा हूं।

इसलिए, मैं इस पेज को पढ़ रहा हूं, कॉमन रेस्ट मिस्टेक्स , और मैंने पाया है कि मैं सत्र से पूरी तरह से अप्रासंगिक हूं। यह वही है जो पृष्ठ कहता है:

क्लाइंट को "लॉगिन" या "कनेक्शन शुरू करने" की कोई आवश्यकता नहीं होनी चाहिए। HTTP प्रमाणीकरण हर संदेश पर स्वचालित रूप से किया जाता है। ग्राहक अनुप्रयोग संसाधनों के उपभोक्ता हैं, न कि सेवाओं के। इसलिए लॉग इन करने के लिए कुछ भी नहीं है! मान लीजिए कि आप एक REST वेब सेवा पर उड़ान बुक कर रहे हैं। आप सेवा के लिए एक नया "सत्र" कनेक्शन नहीं बनाते हैं। बल्कि आप एक नया यात्रा कार्यक्रम बनाने के लिए "यात्रा कार्यक्रम निर्माता" से पूछते हैं। आप रिक्त स्थान को भरना शुरू कर सकते हैं, लेकिन फिर कुछ अन्य रिक्त स्थानों को भरने के लिए वेब पर कुछ अलग घटक प्राप्त कर सकते हैं। कोई सत्र नहीं है इसलिए ग्राहकों के बीच सत्र राज्य के प्रवास की कोई समस्या नहीं है। "सत्र आत्मीयता" का भी कोई मुद्दा नहीं है

ठीक है, मुझे लगता है कि HTTP प्रमाणीकरण हर संदेश पर स्वचालित रूप से किया जाता है - लेकिन कैसे? क्या प्रत्येक अनुरोध के साथ उपयोगकर्ता नाम / पासवर्ड भेजा जाता है? नहीं है कि सिर्फ हमले की सतह क्षेत्र में वृद्धि? मुझे लगता है कि मैं पहेली का हिस्सा याद कर रहा हूं।

क्या REST सेवा के लिए बुरा होगा, कहते हैं, /sessionकि एक GET अनुरोध स्वीकार करता है, जहाँ आप अनुरोध के भाग के रूप में एक उपयोगकर्ता नाम / पासवर्ड में पास करेंगे, और एक सत्र टोकन लौटाते हैं यदि प्रमाणीकरण सफल रहा, तो यह हो सकता है बाद के अनुरोधों के साथ पारित किया? क्या यह किसी अन्य दृष्टिकोण से समझ में आता है, या यह बात याद आ रही है?


हर अनुरोध हमेशा प्रमाणित होता है, सत्र अपहरण एक बात है। बाकी यह अधिक स्पष्ट है लेकिन अधिक उजागर नहीं है।
जैसन

जवाबों:


79

Restful होने के लिए, प्रत्येक HTTP अनुरोध को अपने प्राप्तकर्ता के लिए पर्याप्त जानकारी लेकर जाना चाहिए ताकि इसे HTTP के स्टेटलेस प्रकृति के साथ पूर्ण सामंजस्य के साथ संसाधित किया जा सके।

ठीक है, मुझे लगता है कि HTTP प्रमाणीकरण हर संदेश पर स्वचालित रूप से किया जाता है - लेकिन कैसे?

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

क्या REST सेवा के लिए बुरा होगा, कहते हैं, / सत्र, जो एक GET अनुरोध स्वीकार करता है, जहां आप अनुरोध के भाग के रूप में उपयोगकर्ता नाम / पासवर्ड में पास होंगे, और प्रमाणीकरण सफल होने पर एक सत्र टोकन लौटाते हैं, जो हो सकता है बाद में अनुरोधों के साथ पारित किया जाए? क्या यह किसी अन्य दृष्टिकोण से समझ में आता है, या यह बात याद आ रही है?

चूंकि यह राज्य का वहन करता है इसलिए यह RESTful नहीं होगा, लेकिन यह उपयोगकर्ताओं के लिए एक सुविधा होने के बाद भी काफी सामान्य है; उपयोगकर्ता को हर बार लॉगिन नहीं करना पड़ता है।

आप "सत्र टोकन" में जो वर्णन करते हैं, उसे आमतौर पर एक लॉगिन कुकी के रूप में जाना जाता है । उदाहरण के लिए, यदि आप अपने Yahoo! खाते में एक चेकबॉक्स है जो कहता है कि "मुझे 2 सप्ताह तक लॉग इन रखें"। यह अनिवार्य रूप से कह रहा है (आपके शब्दों में) "यदि मैं सफलतापूर्वक लॉगिन करता हूं तो मेरे सत्र को 2 सप्ताह तक जीवित रखें।" वेब ब्राउज़र प्रत्येक HTTP अनुरोध के साथ इस तरह के लॉगिन कुकीज़ (और संभवतः अन्य) भेजेंगे जो आप इसे आपके लिए बनाने के लिए कहते हैं।


5
इस जवाब से मुझे कोई मतलब नहीं है। सबसे पहले, यह कहता है कि लॉगिन और पासवर्ड को हर बार पास करना ठीक है और इस तरह एक बार भी, जो समझ में आता है। फिर, क्लाइंट को टोकन के रूप में सफल लॉगिन स्थिति में लौटने का सुझाव दिया जाता है। यदि आवश्यक हो, तो टोकन निर्माण के समय को सांकेतिक शब्दों में बदलना कर सकता है। हमें निश्चित रूप से ग्राहक को जानकारी वापस करने की अनुमति है। इसलिए, यह सुझाव मुझे ठीक लगता है। उत्तर कहता है कि यह ठीक नहीं है क्योंकि "यह राज्य करता है," लेकिन "रीस्ट" में "एसटी" का विचार नहीं है जो क्लाइंट और सर्वर के बीच में स्थानांतरित हो सकता है?

33

प्रत्येक HTTP अनुरोध के लिए प्रमाणीकरण की आवश्यकता के लिए REST सेवा के लिए यह असामान्य नहीं है। उदाहरण के लिए, अमेज़ॅन एस 3 के लिए आवश्यक है कि प्रत्येक अनुरोध पर एक हस्ताक्षर हो जो उपयोगकर्ता क्रेडेंशियल्स, प्रदर्शन करने के लिए सटीक अनुरोध और वर्तमान समय से लिया गया हो। यह हस्ताक्षर क्लाइंट पक्ष पर गणना करना आसान है, सर्वर द्वारा जल्दी से सत्यापित किया जा सकता है, और एक हमलावर के लिए सीमित उपयोग का है जो इसे स्वीकार करता है (चूंकि यह वर्तमान समय पर आधारित है)।


3
+1 क्या आप इसे विस्तृत कर सकते हैं: एक हमलावर के लिए सीमित उपयोग का है जो इसे स्वीकार करता है (चूंकि यह वर्तमान समय पर आधारित है) ? आप एक कुकी के बारे में बात कर रहे हैं जिसमें एन्क्रिप्टेड उपयोगकर्ता नाम और पासवर्ड शामिल हैं? जैसे एसओ करता है? (IMHO)
रॉय नमिर

2
@ रोयनीराम: मैं एक कुकी के बारे में बात नहीं कर रहा हूं। S3 द्वारा उपयोग किया गया हस्ताक्षर HTTP अनुरोध का एक पैरामीटर है, लेकिन यह कुकी नहीं है, यह हर अनुरोध के लिए पुनर्गणना है।
ग्रेग हेविगिल

इसलिए अगर मुझे किसी उपयोगकर्ता के बारे में कुछ जानकारी सहेजने की आवश्यकता है, तो मैं इसे कहाँ बचाऊँगा? db में? मैं db के लिए प्रत्येक अनुरोध पर जाना नहीं चाहता .... और अभी भी मैं आराम का उपयोग करना चाहता हूं .... क्या आप मदद कर सकते हैं?
रॉय नमिर

@ रोयनिमीर: यदि आपके पास कुछ लक्ष्य पूरा करने के बारे में विशिष्ट प्रश्न हैं, तो कृपया एक नया प्रश्न पूछें । मैं यहाँ टिप्पणियों में अतिरिक्त प्रश्नों का उत्तर नहीं दे सकता।
ग्रेग हेवगिल

10

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

आपके मामले में मैं कहता हूं कि यह RESTy है, लेकिन अपने REST API में देशी php सत्रों का उपयोग करने से बचने का प्रयास करें और समय की निर्धारित अवधि में समाप्त होने वाले अपने स्वयं के हैशेड टोकन का निर्माण शुरू करें!


1
धन्यवाद। एक को देशी php सत्र से बचना चाहिए और इसके बजाय स्वयं के हैश टोकन का उपयोग करना चाहिए?
मैथ्यू

ऐसा कोई भी शानदार कारण नहीं है जो मैं कहता हूं, सिर्फ अधिक सुरक्षा और अधिक नियंत्रण के लिए।
EvilThinker 15

यह स्वीकृत उत्तर से बेहतर है। कम से कम, यह सुझाव को RESTy के रूप में स्वीकार करता है, जो समझ में आता है। हालाँकि, मैं यह नहीं देखता कि पारित जानकारी का उपयोग उपयोगकर्ता पर निर्भर प्राधिकरण करने के लिए क्यों नहीं किया जा सकता है। कुछ उपयोगकर्ताओं के पास कुछ डेटा तक पहुंच हो सकती है और अन्य में नहीं। यह प्रोटोकॉल को नॉन रेस्टफुल नहीं बनाता है।

8

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


11
@ unforgiven3 जब तक लौटाए गए टोकन का उपयोग केवल उपयोगकर्ता को प्रमाणित करने के लिए किया जाता है और सर्वर द्वारा उपयोगकर्ता को सर्वर पर संग्रहीत अन्य राज्य में संबद्ध करने के लिए उपयोग नहीं किया जाता है, तो मुझे कोई REST बाधाओं का उल्लंघन नहीं दिखता है।
डारेल मिलर

4
@ unforgiven3 सर्वर द्वारा दिया गया टोकन, वास्तव में, उपयोगकर्ता को प्रमाण देता है कि वे कहते हैं कि वे कौन हैं। इसलिए, उपयोगकर्ता नाम और पासवर्ड सहित प्रत्येक अनुरोध के बजाय, प्रत्येक अनुरोध में एक टोकन शामिल है जो इस तरह से बनाया गया है कि सर्वर इसकी सत्यता के बारे में आश्वस्त हो सकता है।
डारेल मिलर

1
@ unforgiven3, डारेल सही है। टोकन प्रतिध्वनित होता है, क्लाइंट को हर HTTP रिक्वेस्ट पर उसी तरह भेजना होता है, जैसे कि टोकन समाप्त होने तक बेसिक, डाइजेस्ट ऑथेंटिकेशन में। जब ऐसा होता है तो ग्राहक लॉगिन को दोहरा सकता है, वैकल्पिक रूप से उपयोगकर्ता से क्रेडेंशियल, या जो भी पूछ सकता है। यदि आप चाहें, तो मैं उत्तर को विस्तृत कर सकता हूं। संपादित करें: (और पुराने सवालों के जवाब के साथ रखने के लिए धन्यवाद!)
मोगी

1
कोई बात नहीं, मोगसी, हमेशा इस तरह की चीजों पर चर्चा करने के लिए दिलचस्प होते हैं :-) मुझे लगता है कि मैं देख रहा हूं कि आप लोग इस के साथ कहां जा रहे हैं, दुर्भाग्य से मैं सिर्फ इतना नहीं समझ पा रहा हूं कि यह वास्तव में समझ में आता है समझें कि कैसे प्रत्येक HTTP अनुरोध को टोकन वापस भेजा जाता है, लेकिन यह एक कार्यान्वयन विवरण लगता है)। हालाँकि, अब मैं यह देखता हूं कि यह विधि REST सिद्धांतों का उल्लंघन क्यों नहीं करती है। प्रतिक्रियाओं के लिए धन्यवाद!
रोब

6
@ unforgiven3, यह मदद कर सकता है: टोकन एक हस्ताक्षरित जानकारी है। अतः यह स्वयंभू है। सर्वर पहले से संग्रहीत स्थिति की जाँच किए बिना टोकन को मान्य कर सकता है। तो यह सिर्फ एक राज्य है जो क्लाइंट पर संग्रहीत है और आगे और पीछे स्थानांतरित किया जाता है।
इरावनची

5

ठीक है, मुझे लगता है कि HTTP प्रमाणीकरण हर संदेश पर स्वचालित रूप से किया जाता है - लेकिन कैसे?

"प्राधिकरण:" HTTP हेडर क्लाइंट द्वारा भेजते हैं। या तो बुनियादी (सादा पाठ) या पचाना।

क्या REST सेवा के लिए बुरा होगा, कहते हैं, / सत्र, जो एक GET अनुरोध स्वीकार करता है, जहां आप अनुरोध के भाग के रूप में उपयोगकर्ता नाम / पासवर्ड में पास होंगे, और प्रमाणीकरण सफल होने पर एक सत्र टोकन लौटाते हैं, जो हो सकता है बाद में अनुरोधों के साथ पारित किया जाए? क्या यह किसी अन्य दृष्टिकोण से समझ में आता है, या यह बात याद आ रही है?

सत्र का संपूर्ण विचार स्टेटस एप्लिकेशन को स्टेटलेस प्रोटोकॉल (एचटीटीपी) और डंब क्लाइंट (वेब ​​ब्राउजर) का उपयोग करके राज्य बनाना है, ताकि सर्वर पर राज्य को बनाए रखा जा सके। REST सिद्धांतों में से एक है "हाइपरमीडिया लिंक में उपयोग के लिए एक सार्वभौमिक सिंटैक्स का उपयोग करके प्रत्येक संसाधन विशिष्ट रूप से संबोधित करने योग्य है" । सत्र चर कुछ ऐसी चीजें हैं जिन्हें URI के माध्यम से एक्सेस नहीं किया जा सकता है। वास्तव में RESTful एप्लिकेशन क्लाइंट की ओर से स्थिति बनाए रखेगा, HTTP द्वारा सभी आवश्यक चर, अधिमानतः URI में भेज रहा है।

उदाहरण: पृष्ठन के साथ खोज। आपके पास फ़ॉर्म में URL होगा

http://server/search/urlencoded-search-terms/page_num

यह बुकमार्क करने योग्य URL के साथ बहुत कुछ है


4
प्रमाणीकरण जानकारी URI के माध्यम से पहुँच योग्य नहीं है, हालाँकि - हर कोई अनुरोध हेडर के भाग के रूप में सामान्य जानकारी भेजने के बारे में बात कर रहा है। अनुरोध के साथ सत्र टोकन सहित यह कैसे अलग है? मैं यूआरआई में सत्र टोकन का उपयोग नहीं कर रहा हूं, लेकिन अनुरोध में पारित डेटा में।
रोब

यदि आप उस कार्रवाई को अंजाम देने के लिए अधिकृत हैं, तो प्रमाणीकरण स्थापित होता है, और Restful एप्लिकेशन में इसका परिणाम प्रभावित नहीं होगा।
vartec

4
यदि आप उस कार्रवाई को अंजाम देने के लिए अधिकृत हैं तो एक सत्र टोकन भी स्थापित होता है। आपको क्या मतलब है कि इसका परिणाम पर असर नहीं पड़ेगा? यदि कॉलर अधिकृत नहीं है, तो उन्हें एक अधिकृत त्रुटि मिलती है। एक सत्र टोकन के साथ एक ही बात। मैं वास्तव में अंतर नहीं देखता हूं?
रोब

3
नहीं, सत्र टोकन सर्वर पर सहेजे गए राज्य के लिए एक हैंडल है । यह सिर्फ Restful नहीं है। अधिकृत नहीं के रूप में, मैं एक परिणाम के रूप में नहीं देखते हैं। मैं इसके बजाय एक अपवाद (कोशिश / पकड़ में) पर विचार करूँगा।
vartec

उचित काफी, vartec - कि समझ में आता है। पालन ​​करने के लिए धन्यवाद!
रोब

3

मुझे लगता है कि आपका सुझाव ठीक है, यदि आप ग्राहक सत्र जीवन समय को नियंत्रित करना चाहते हैं। मुझे लगता है कि रेस्टफुल आर्किटेक्चर आपको स्टेटलेस एप्लिकेशन विकसित करने के लिए प्रोत्साहित करता है। जैसा कि @ 2pence ने लिखा है "प्रत्येक HTTP अनुरोध को अपने प्राप्तकर्ता के लिए पर्याप्त जानकारी लेनी चाहिए ताकि वह इसे HTTP के स्टेटलेस प्रकृति के साथ पूर्ण सामंजस्य के साथ संसाधित कर सके"

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

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