क्या सत्र वास्तव में कठोरता का उल्लंघन करते हैं?


491

क्या RESTful API में सत्रों का उपयोग करना वास्तव में Restfulness का उल्लंघन है? मैंने कई रायों को या तो दिशा में जाते देखा है, लेकिन मैं आश्वस्त नहीं हूं कि सत्र Restless हैं । मेरे नज़रिये से:

  • प्रमाणीकरण RESTfulness के लिए निषिद्ध नहीं है (अन्यथा Restful सेवाओं में बहुत कम उपयोग होगा)
  • प्रमाणीकरण अनुरोध में एक प्रमाणीकरण टोकन भेजकर किया जाता है, आमतौर पर हेडर
  • इस प्रमाणीकरण टोकन को किसी भी तरह प्राप्त करने की आवश्यकता है और इसे रद्द किया जा सकता है, जिस स्थिति में इसे नवीनीकृत करने की आवश्यकता है
  • प्रमाणीकरण टोकन को सर्वर द्वारा मान्य किया जाना चाहिए (अन्यथा यह प्रमाणीकरण नहीं होगा)

तो सत्र इसका उल्लंघन कैसे करते हैं?

  • क्लाइंट-साइड, सत्र कुकीज़ का उपयोग करके महसूस किए जाते हैं
  • कुकीज़ बस एक अतिरिक्त HTTP हेडर हैं
  • एक सत्र कुकी को किसी भी समय प्राप्त और निरस्त किया जा सकता है
  • यदि आवश्यक हो तो सत्र कुकीज़ का अनंत जीवन काल हो सकता है
  • सत्र आईडी (प्रमाणीकरण टोकन) सर्वर-साइड मान्य है

जैसे, क्लाइंट के लिए, एक सत्र कुकी बिल्कुल किसी अन्य HTTP हेडर आधारित प्रमाणीकरण तंत्र के समान है, सिवाय इसके कि यह Cookieहेडर का उपयोग करता है Authorizationया कुछ अन्य मालिकाना हेडर के बजाय । अगर कुकी मान सर्वर-साइड से जुड़ा कोई सत्र नहीं था, तो इससे कोई फर्क क्यों पड़ेगा? सर्वर साइड कार्यान्वयन को क्लाइंट को तब तक चिंता करने की आवश्यकता नहीं है जब तक कि सर्वर रेस्टफुल का व्यवहार नहीं करता है । जैसे, कुकीज़ को स्वयं एपीआई रेस्टलेस नहीं बनाना चाहिए , और सत्र केवल ग्राहक को कुकीज़ हैं।

क्या मेरी धारणाएँ गलत हैं? क्या सत्र कुकीज़ बनाता बेचैन ?


5
मैंने उस सटीक मुद्दे को यहाँ कवर किया है: stackoverflow.com/questions/1296421/rest-complex-applications/…
विल हार्टुंग

5
उसको जोड़ने के लिए, यदि आप केवल प्रमाणीकरण के लिए सत्र का उपयोग कर रहे हैं, तो उपलब्ध हेडर का उपयोग क्यों नहीं करें? यदि नहीं, और आप बातचीत के अन्य राज्य के लिए सत्र का उपयोग कर रहे हैं, तो वह स्टेटलेस बाधा का उल्लंघन कर रहा है।
विल हार्टुंग

2
@ धन्यवाद धन्यवाद। ऐसा लगता है कि आप उपयोगकर्ता द्वारा सबमिट किए गए डेटा को अस्थायी रूप से संग्रहीत करने के लिए सत्रों के बारे में बात कर रहे हैं, जबकि मेरे मामले में मैं उनके बारे में प्रमाणीकरण के लिए कार्यान्वयन विवरण के रूप में बात कर रहा हूं। हो सकता है कि यह असहमति कहां से आए?
deceze

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

7
ज़रूर, लेकिन फिर क्यों अपने खुद के हेडर नहीं बनाते हैं, या ऑर्केनिक टोकन के लिए कुछ अन्य हेडर को हाईजैक करते हैं। X-XYZZY हेडर का उपयोग करें। यह सिर्फ वाक्यविन्यास सही है? हेडर जानकारी देते हैं। प्राधिकरण शीर्ष लेख आपकी कुकी की तुलना में अधिक "स्व-दस्तावेजीकरण" है, क्योंकि "हर कोई" यह जानता है कि प्रामाणिक शीर्षलेख क्या है। यदि वे केवल JSESSIONID (या जो कुछ भी) देखते हैं, तो वे कोई धारणा नहीं बना सकते हैं, या इससे भी बदतर, गलत धारणाएं बना सकते हैं (वह सत्र में क्या संग्रहीत कर रहा है, इसके लिए और क्या उपयोग किया जाता है, आदि)। क्या आप अपने कोड Aq12hsg में अपने चर नाम रखते हैं? नहीं बिलकुल नहीं। एक ही बात यहाँ लागू होती है।
विल हार्टुंग

जवाबों:


299

सबसे पहले, कुछ शब्दों को परिभाषित करते हैं:

  • RESTful:

    एक इस खंड में वर्णित बाकी बाधाओं के अनुरूप अनुप्रयोगों को चिह्नित कर सकता है जो "रेस्टफुल" हैं। [१५] यदि कोई सेवा आवश्यक बाधाओं का उल्लंघन करती है, तो इसे Restful नहीं माना जा सकता है।

    विकिपीडिया के अनुसार ।

  • स्थिर बाधा:

    हम आगे क्लाइंट-सर्वर इंटरैक्शन में एक बाधा जोड़ते हैं: संचार प्रकृति में स्टेटलेस होना चाहिए, जैसा कि क्लाइंट-स्टेटलेस-सर्वर (सीएसएस) शैली में धारा 3.4.3 (चित्रा 5-3), जैसे कि क्लाइंट से प्रत्येक अनुरोध। सर्वर में अनुरोध को समझने के लिए आवश्यक सभी जानकारी होनी चाहिए, और सर्वर पर किसी भी संग्रहीत संदर्भ का लाभ नहीं उठा सकता है। इसलिए राज्य को पूरी तरह से ग्राहक पर रखा जाता है।

    फील्डिंग शोध प्रबंध के अनुसार ।

इसलिए सर्वर साइड सेशन REST के स्टेटलेस कॉन्स्टेंट का उल्लंघन करता है, और इसलिए RESTfulness या तो।

जैसे, क्लाइंट के लिए, एक सत्र कुकी बिल्कुल किसी अन्य HTTP हेडर आधारित प्रमाणीकरण तंत्र के समान है, सिवाय इसके कि वह प्राधिकरण या कुछ अन्य स्वामित्व हेडर के बजाय कुकी हेडर का उपयोग करता है।

सत्र कुकीज़ द्वारा आप क्लाइंट राज्य को सर्वर पर संग्रहीत करते हैं और इसलिए आपके अनुरोध में एक संदर्भ होता है। आइए अपने सिस्टम में एक लोड बैलेंसर और एक अन्य सेवा उदाहरण जोड़ने का प्रयास करें। इस मामले में आपको सेवा के उदाहरणों के बीच सत्र साझा करना होगा। ऐसी प्रणाली को बनाए रखना और बढ़ाना कठिन है, इसलिए यह बुरी तरह से तराजू ...

मेरी राय में कुकीज़ के साथ कुछ भी गलत नहीं है। कुकी तकनीक एक क्लाइंट साइड स्टोरिंग मैकेनिज्म है, जिसमें संग्रहीत डेटा को प्रत्येक अनुरोध पर कुकी हेडर से स्वचालित रूप से जोड़ा जाता है। मैं एक अन्य बाधा के बारे में नहीं जानता, जिसमें उस तरह की तकनीक की समस्या है। इसलिए प्रौद्योगिकी के साथ कोई समस्या नहीं है, समस्या इसके उपयोग के साथ है। फील्डिंग ने एक सब-सेक्शन लिखा कि वह क्यों सोचता है कि एचटीटीपी कुकीज़ खराब हैं।

मेरे नज़रिये से:

  • प्रमाणीकरण RESTfulness के लिए निषिद्ध नहीं है (अन्यथा Restful सेवाओं में बहुत कम उपयोग होगा)
  • प्रमाणीकरण अनुरोध में एक प्रमाणीकरण टोकन भेजकर किया जाता है, आमतौर पर हेडर
  • इस प्रमाणीकरण टोकन को किसी भी तरह प्राप्त करने की आवश्यकता है और इसे रद्द किया जा सकता है, जिस स्थिति में इसे नवीनीकृत करने की आवश्यकता है
  • प्रमाणीकरण टोकन को सर्वर द्वारा मान्य किया जाना चाहिए (अन्यथा यह प्रमाणीकरण नहीं होगा)

आपका दृष्टिकोण बहुत ठोस था। एकमात्र समस्या सर्वर पर प्रमाणीकरण टोकन बनाने की अवधारणा के साथ थी। आपको उस भाग की आवश्यकता नहीं है। आपको जो चाहिए वह क्लाइंट पर उपयोगकर्ता नाम और पासवर्ड संग्रहीत करना है और इसे हर अनुरोध के साथ भेजें। आपको एचटीटीपी बेसिक नॉर्म्स और एनक्रिप्टेड कनेक्शन की तुलना में ऐसा करने की ज्यादा जरूरत नहीं है:

चित्र 1. - विश्वसनीय ग्राहकों द्वारा स्टेटलेस प्रमाणीकरण

  • चित्र 1. - विश्वसनीय ग्राहकों द्वारा स्टेटलेस प्रमाणीकरण

आपको संभवतः चीजों को तेज़ करने के लिए सर्वर साइड पर इन-मेमोरी ऑर्ट कैश की ज़रूरत है, क्योंकि आपको हर अनुरोध को प्रमाणित करना होगा।

अब यह आपके द्वारा लिखे गए विश्वसनीय ग्राहकों द्वारा बहुत अच्छी तरह से काम करता है, लेकिन तीसरे पक्ष के ग्राहकों के बारे में क्या? उनके पास उपयोगकर्ता नाम और पासवर्ड और उपयोगकर्ताओं की सभी अनुमतियां नहीं हो सकती हैं। इसलिए आपको अलग से स्टोर करना होगा कि किसी विशिष्ट उपयोगकर्ता के पास 3rd पार्टी क्लाइंट की क्या अनुमति हो सकती है। तो क्लाइंट डेवलपर्स उन्हें 3 पार्टी क्लाइंट रजिस्टर कर सकते हैं, और एक अद्वितीय एपीआई कुंजी प्राप्त कर सकते हैं और उपयोगकर्ता 3 पार्टी क्लाइंट को अपनी अनुमति के कुछ हिस्से तक पहुंचने की अनुमति दे सकते हैं। जैसे नाम और ईमेल पता पढ़ना, या अपने दोस्तों को सूचीबद्ध करना, आदि ... एक 3 पार्टी क्लाइंट को अनुमति देने के बाद सर्वर एक टोकन उत्पन्न करेगा। ये एक्सेस टोकन उपयोगकर्ता द्वारा दी गई अनुमतियों को एक्सेस करने के लिए 3rd पार्टी क्लाइंट द्वारा उपयोग किया जा सकता है, जैसे:

चित्रा 2. - 3 पार्टी ग्राहकों द्वारा स्टेटलेस प्रमाणीकरण

  • चित्रा 2. - 3 पार्टी ग्राहकों द्वारा स्टेटलेस प्रमाणीकरण

तो 3rd पार्टी क्लाइंट को एक विश्वसनीय क्लाइंट से एक्सेस टोकन मिल सकता है (या सीधे उपयोगकर्ता से)। उसके बाद यह एपीआई कुंजी और एक्सेस टोकन के साथ एक वैध अनुरोध भेज सकता है। यह सबसे बुनियादी 3rd पार्टी ऑर्टिक मैकेनिज्म है। आप हर 3 पार्टी के सिस्टम के दस्तावेज में कार्यान्वयन विवरण के बारे में अधिक पढ़ सकते हैं, जैसे OAuth। बेशक यह अधिक जटिल और अधिक सुरक्षित हो सकता है, उदाहरण के लिए आप सर्वर साइड पर हर एक अनुरोध के विवरण पर हस्ताक्षर कर सकते हैं और अनुरोध के साथ हस्ताक्षर भेज सकते हैं, और इसी तरह ... वास्तविक समाधान आपके आवेदन की आवश्यकता पर निर्भर करता है।


5
हां, आप पूरी तरह से सही हैं। जब से मैंने इस सवाल को पोस्ट किया है मैं पूरी तरह से उसे देखने आया हूं। तकनीकी विवरणों में देखने पर सत्र कुकीज़ कुछ विशेष नहीं हैं, लेकिन यह पेड़ों के लिए जंगल को याद कर रहा है। अच्छे चार्ट के कारण आपके उत्तर को स्वीकार किया। ;)
deceze

1
ठीक है, मैंने पुनर्विचार किया, REST सेवा की प्रतिक्रिया प्राधिकरण पर निर्भर नहीं होनी चाहिए, इसलिए मुझे लगता है कि पहले 2 समाधान 100% ठीक हैं, और अन्य ठीक हैं यदि सेवा केवल यह तय करने के लिए जानकारी का उपयोग करती है कि क्या यह अनुरोध की अनुमति देता है या नहीं। इसलिए मुझे लगता है कि उपयोगकर्ता अनुमतियों को वर्तमान संसाधन के प्रतिनिधित्व पर प्रभाव डालना चाहिए।
inf3rno 14

1
मैं प्रतिनिधित्व की अनुमतियों की निर्भरता के बारे में एक प्रश्न बनाऊंगा। उचित समाधान मिलते ही मैं इस उत्तर का विस्तार करूँगा।
inf3rno

3
@ inf3rno, यह सच है कि पूरी तरह से Restful सेवा पारंपरिक रूप से लागू होने वाले तरीके से प्रमाणीकरण के लिए सत्र कुकीज़ पर निर्भर नहीं कर सकती है। हालाँकि, आप कुकी का उपयोग प्रमाणीकरण करने के लिए कर सकते हैं यदि कुकी में सभी राज्य जानकारी होती है जो सर्वर को बाद में आवश्यकता होगी। आप कुकी को सार्वजनिक / निजी कुंजी जोड़ी के साथ हस्ताक्षर करके छेड़छाड़ से सुरक्षित बना सकते हैं। नीचे मेरी टिप्पणी देखो।
jcoffland

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

334

सबसे पहले, REST एक धर्म नहीं है और इस तरह से संपर्क नहीं किया जाना चाहिए। जबकि Restful सेवाओं के लिए लाभ हैं, आपको केवल REST के सिद्धांतों का पालन करना चाहिए जहाँ तक वे आपके आवेदन के लिए समझ में आते हैं।

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

Google की वेब सेवाएँ एक Restful प्रणाली का एक शानदार उदाहरण हैं। उन्हें प्रत्येक अनुरोध पर पारित होने के लिए उपयोगकर्ता की प्रमाणीकरण कुंजी के साथ प्रमाणीकरण हेडर की आवश्यकता होती है। यह REST सिद्धांतों को थोड़ा उल्लंघन करता है, क्योंकि सर्वर प्रमाणीकरण कुंजी की स्थिति को ट्रैक कर रहा है। इस कुंजी की स्थिति को बनाए रखा जाना चाहिए और इसकी समाप्ति तिथि / समय के कुछ प्रकार होते हैं, जिसके बाद यह पहुँच प्रदान नहीं करता है। हालाँकि, जैसा कि मैंने अपने पोस्ट के शीर्ष पर उल्लेख किया है, एक आवेदन को वास्तव में काम करने की अनुमति देने के लिए बलिदान करना होगा। उस ने कहा, प्रमाणीकरण टोकन को इस तरह से संग्रहित किया जाना चाहिए जो सभी संभावित ग्राहकों को उनके वैध समय के दौरान एक्सेस देना जारी रखने की अनुमति देता है। यदि एक सर्वर प्रमाणीकरण कुंजी की स्थिति को इस बिंदु पर प्रबंधित कर रहा है कि एक अन्य लोड संतुलित सर्वर उस कुंजी के आधार पर अनुरोधों को पूरा नहीं कर सकता है, आपने वास्तव में REST के सिद्धांतों का उल्लंघन करना शुरू कर दिया है। Google की सेवाएँ यह सुनिश्चित करती हैं कि किसी भी समय, आप अपने फ़ोन पर लोड बैलेंस सर्वर A के विरुद्ध एक प्रमाणीकरण टोकन ले सकते हैं और अपने डेस्कटॉप से ​​लोड बैलेंस सर्वर B को हिट कर सकते हैं और फिर भी सिस्टम तक पहुँच प्राप्त कर सकते हैं और उसी संसाधनों के लिए निर्देशित हो सकते हैं यदि अनुरोध समान थे।

यह सब उबलता है कि आपको यह सुनिश्चित करने की आवश्यकता है कि आपके प्रमाणीकरण टोकन को किसी प्रकार (डेटाबेस, कैश, जो भी हो) के एक बैकिंग स्टोर के खिलाफ मान्य किया जाता है ताकि यह सुनिश्चित हो सके कि आप जितनी संभव हो उतने REST गुणों को संरक्षित करें।

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


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

4
@ डारेल एक निष्पक्ष पर्याप्त बिंदु। मुझे पूरा यकीन नहीं है कि Google यह कैसे करता है, लेकिन समाप्ति समय प्रमाणीकरण टोकन में एन्कोड किया जा सकता है। मेरा मानना ​​है कि मेरा बड़ा बिंदु अभी भी खड़ा है। कुछ प्रकार के राज्य हैं जिन्हें बस बनाए रखा जाना चाहिए और जब तक आप समझते हैं कि आरईएस स्टेटलेसनेस के लिए क्यों कहता है, आप इसे इस तरह से उल्लंघन कर सकते हैं जो सिस्टम के बाकी हिस्सों पर कई नतीजों के साथ समझ में आता है और एक प्रतिष्ठित वास्तुकला के फायदे ।
जारेड हार्डिंग

7
चूंकि अब तक कोई अन्य तर्क नहीं दिया गया है, मैं इसे अच्छी तरह से लिखित प्रतिक्रिया स्वीकार कर रहा हूं। मुझे लगता है कि महत्वपूर्ण हिस्सा यह है कि स्टेटलेस सर्वर का अर्थ स्टेटलेस सर्वर नहीं है , ऐसा कुछ जो मुझे लगता है कि अक्सर गलत समझा जाता है या गलत होता है। सर्वर में (और आमतौर पर ) कोई भी राज्य होना चाहिए , जब तक कि वह बेकार व्यवहार करता है ।
deceze

10
मैंने बहुत उपदेश सुना है कि सत्र संयमित नहीं होते हैं। यदि आप एक वेब ऐप बनाने की कोशिश कर रहे हैं तो HTTP बेसिक ऑथेंटिकेशन एक वास्तविक कदम है।
बेन थर्ले

1
@ मायका हेनिंग, आप गलत धारणा बना रहे हैं कि सर्वर को प्रमाणीकरण टोकन को मान्य करने के लिए राज्य की जानकारी की आवश्यकता है। यदि आप निजी कुंजी नहीं जानते हैं, तो हम यह मान सकते हैं कि आप एक सार्वजनिक / निजी कुंजी जोड़े द्वारा हस्ताक्षरित टोकन नहीं बना सकते। यह सत्यापित करने के लिए कि टोकन आपके लिए आवश्यक है, सार्वजनिक कुंजी है। मैं अभी भी मानता हूं कि पूरी तरह से विश्वसनीय प्रमाणीकरण संभव है।
23 अक्टूबर को jcoffland

12

कुकीज़ प्रमाणीकरण के लिए नहीं हैं। एक पहिये को क्यों मजबूत करें? HTTP में अच्छी तरह से डिज़ाइन किया गया प्रमाणीकरण तंत्र है। यदि हम कुकीज़ का उपयोग करते हैं, तो हम केवल एक ट्रांसपोर्ट प्रोटोकॉल के रूप में HTTP का उपयोग करते हैं, इस प्रकार हमें अपनी सिग्नलिंग प्रणाली बनाने की आवश्यकता है, उदाहरण के लिए, उपयोगकर्ताओं को यह बताने के लिए कि उन्होंने गलत प्रमाणीकरण की आपूर्ति की (HTTP 401 का उपयोग करना गलत होगा क्योंकि हम शायद नहीं करेंगे। Www-Authenticateएक ग्राहक को आपूर्ति , क्योंकि HTTP स्पेक्स की आवश्यकता है :))। यह भी ध्यान दिया जाना चाहिए कि Set-Cookieकेवल ग्राहक के लिए एक सिफारिश है। इसकी सामग्री को बचाया जा सकता है या नहीं किया जा सकता है (उदाहरण के लिए, यदि कुकीज़ अक्षम हैं), जबकि Authorizationहेडर प्रत्येक अनुरोध पर स्वचालित रूप से भेजा जाता है।

एक और बात यह है कि, एक प्राधिकरण कुकी प्राप्त करने के लिए, आप शायद पहले कहीं अपने क्रेडेंशियल्स की आपूर्ति करना चाहेंगे? यदि ऐसा है, तो यह RESTless नहीं होगा? सरल उदाहरण:

  • आप GET /aबिना कुकी के कोशिश करें
  • आपको किसी तरह प्राधिकरण का अनुरोध मिलता है
  • तुम जाओ और किसी तरह अधिकृत करो POST /auth
  • आपको मिला Set-Cookie
  • आप कुकी के GET /a साथ प्रयास करें । लेकिन क्या GET /aइस मामले में मूर्खतापूर्ण व्यवहार होता है ?

इसे संक्षेप में, मेरा मानना ​​है कि यदि हम कुछ संसाधन तक पहुँचते हैं और हमें प्रमाणित करने की आवश्यकता है, तो हमें उसी संसाधन पर प्रमाणित करना चाहिए , कहीं और नहीं।


1
इस बीच मैं इस दृष्टिकोण के साथ और भी आसपास आया। मुझे लगता है कि तकनीकी रूप से इससे बहुत कम फर्क पड़ता है, यह सब सिर्फ HTTP हेडर है। हालांकि यह सत्य है कि प्रमाणीकरण व्यवहार स्वयं Restful नहीं है, यदि एक अलग पते के माध्यम से लॉगिन आवश्यक है। इसलिए कुकीज़ केवल प्रमाणीकरण प्रणाली के साथ एक बड़ी समस्या का एक लक्षण हैं।
deceze

यह वास्तव में इस तथ्य के लिए जिम्मेदार नहीं है कि वेब ब्राउज़र केवल समर्थन करते हैं Authorization: Basicया Digest। यदि आप किसी ब्राउज़र संदर्भ में बुनियादी या डाइजेस्ट ऑर्ट (और आपको चाहिए) की तुलना में अधिक उन्नत करना चाहते हैं, तो आपको Authorizationहेडर के अलावा कुछ और चाहिए ।
ओलिवर चार्ल्सवर्थ

1
बिल्कुल - अगर आप शुद्ध जेएस कर रहे हैं तो चीजें मूल रूप से ठीक हैं (उदाहरण के लिए, वेबस्कैट को छोड़कर)। लेकिन मेरा कहना यह है कि एपीआई आधारित वस्तुस्थिति केवल एक ब्राउज़र परिदृश्य में विचार नहीं है।
ओलिवर चार्ल्सवर्थ

5
GET /aकुकी के बिना और कुकी के साथ स्पष्ट रूप से दो अलग-अलग अनुरोध हैं, और यह उनके लिए अलग व्यवहार करने के लिए स्वीकार्य है।
TRIG

1
@TRiG में जोड़ने के लिए, इस तर्क का पालन करते हुए, GET /aप्रमाणीकरण हेडर भी GET /aप्रमाणीकरण हेडर के बिना ही है , यह REST के लिए समान रूप से अनुपयोगी है। यदि आप एक http हेडर को दूसरे से अलग तरीके से ट्रीट करने जा रहे हैं, तो आप उसे कम से कम संबोधित करेंगे।
जैस्पर

7

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

मुख्य निर्धारणकर्ता यह है: यदि आप एक REST कॉल भेजते हैं, जो कि एक URI है, तो एक बार कॉल सर्वर पर इसे सफलतापूर्वक कर देता है, तो URI उसी सामग्री को वापस करता है, यह मानते हुए कि कोई संक्रमण नहीं हुआ है (PUT, POST, DELETE) ? यह परीक्षण वापस की जा रही त्रुटियों या प्रमाणीकरण अनुरोधों को बाहर कर देगा, क्योंकि उस स्थिति में, अनुरोध अभी तक सर्वर पर नहीं किया गया है, जिसका अर्थ है सर्वलेट या एप्लिकेशन जो दिए गए यूआरआई के अनुरूप दस्तावेज वापस कर देगा।

इसी तरह, POST या PUT के मामले में, क्या आप किसी दिए गए URI / पेलोड को भेज सकते हैं, और चाहे आप कितनी भी बार संदेश भेजें, यह हमेशा एक ही डेटा को अपडेट करेगा, ताकि बाद में GET एक सुसंगत परिणाम लौटाए?

REST अनुप्रयोग डेटा के बारे में है, न कि उस डेटा को स्थानांतरित करने के लिए आवश्यक निम्न-स्तरीय जानकारी के बारे में।

निम्नलिखित ब्लॉग पोस्ट में, रॉय फील्डिंग ने पूरे REST विचार का एक अच्छा सारांश दिया:

http://groups.yahoo.com/neo/groups/rest-discuss/conversations/topics/5841

"एक RESTful प्रणाली एक स्थिर-अवस्था से दूसरे में प्रगति करती है, और प्रत्येक ऐसा स्थिर-अवस्था एक संभावित स्टार्ट-स्टेट और एक संभावित एंड-स्टेट दोनों होता है। यानी, Restful सिस्टम एक अनजान सेट को मानने वाले घटकों की एक अज्ञात संख्या है। नियम ऐसे हैं जो हमेशा या तो REST पर होते हैं या एक RESTful राज्य से दूसरे Restful राज्य में परिवर्तित होते हैं। प्रत्येक राज्य को पूरी तरह से प्रतिनिधित्व (ओं) द्वारा समझा जा सकता है और इसमें जो संक्रमण प्रदान करता है, वह एक समान तक सीमित संक्रमण के साथ होता है। समझने योग्य होने के लिए क्रियाओं का सेट। सिस्टम एक जटिल राज्य आरेख हो सकता है, लेकिन प्रत्येक उपयोगकर्ता एजेंट केवल एक समय में एक राज्य (वर्तमान स्थिर-स्थिति) देखने में सक्षम होता है और इस प्रकार प्रत्येक राज्य सरल होता है और स्वतंत्र रूप से विश्लेषण किया जा सकता है। उपयोगकर्ता, OTOH, किसी भी समय अपने स्वयं के संक्रमण बनाने में सक्षम है (उदाहरण के लिए, URL दर्ज करें, बुकमार्क चुनें)एक संपादक खोलें, आदि) "


प्रमाणीकरण के मुद्दे पर जाएं, चाहे वह कुकीज़ या हेडर के माध्यम से पूरा किया जाए, जब तक कि सूचना यूआरआई और पोस्ट पेलोड का हिस्सा नहीं है, इसका वास्तव में आरईएसटी से कोई लेना-देना नहीं है। इसलिए, स्टेटलेस होने के संबंध में, हम केवल एप्लिकेशन डेटा के बारे में बात कर रहे हैं।

उदाहरण के लिए, जैसे कि उपयोगकर्ता GUI स्क्रीन में डेटा दर्ज करता है, ग्राहक इस बात का ध्यान रख रहा है कि किन क्षेत्रों में प्रवेश किया गया है, जो नहीं हैं, कोई आवश्यक फ़ील्ड जो गायब हैं आदि। यह सब CLIENT CONTEXT है, और इसे भेजा या ट्रैक नहीं किया जाना चाहिए सर्वर द्वारा। सर्वर को जो भेजा जाता है वह फ़ील्ड का पूरा सेट होता है जिसे IDENTIFIED संसाधन (URI द्वारा) में संशोधित करने की आवश्यकता होती है, जैसे कि उस संसाधन में एक RESTful राज्य से दूसरे में संक्रमण होता है।

तो, क्लाइंट उपयोगकर्ता क्या कर रहा है का ट्रैक रखता है, और केवल सर्वर को तार्किक रूप से पूर्ण राज्य संक्रमण भेजता है।


3
मैं यह नहीं देखता कि इस प्रश्न पर कोई प्रकाश कैसे डालता है।
jcoffland

1

HTTP ट्रांजेक्शन, बेसिक एक्सेस ऑथेंटिकेशन, RBAC के लिए उपयुक्त नहीं है, क्योंकि बेसिक एक्सेस ऑथेंटिकेशन एन्क्रिप्ट किए गए यूज़रनेम: पासवर्ड को पहचानने के लिए हर बार इस्तेमाल करता है, जबकि RBAC में जिस चीज़ की ज़रूरत होती है, वह रोल वह होता है जिसे यूज़र किसी खास कॉल के लिए इस्तेमाल करना चाहते हैं। RBAC उपयोगकर्ता नाम पर अनुमतियों को मान्य नहीं करता है, लेकिन भूमिकाओं पर।

आप इस तरह से संक्षिप्त करने के लिए ट्राई कर सकते हैं: usernameRole: पासवर्ड, लेकिन यह बुरा अभ्यास है, और यह अक्षम भी है क्योंकि जब उपयोगकर्ता के पास अधिक भूमिकाएं होती हैं, तो प्रमाणीकरण इंजन को सहमति में सभी भूमिकाओं का परीक्षण करने की आवश्यकता होगी, और यह कि हर कॉल फिर से। यह RBAC के सबसे बड़े तकनीकी लाभों में से एक को नष्ट कर देगा, अर्थात् बहुत जल्दी प्राधिकरण-परीक्षण।

ताकि मूल पहुँच प्रमाणीकरण का उपयोग करके समस्या का समाधान न किया जा सके।

इस समस्या को हल करने के लिए, सत्र-अनुरक्षण आवश्यक है, और ऐसा लगता है, कुछ उत्तरों के अनुसार, आरईएसटी के साथ विरोधाभास में।

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

मेरे लिए HTTP पर सत्र बनाए रखने के कई तरीके नहीं हैं। एक सत्रआईडीडी या एक सेशन के साथ एक हेडर के साथ कुकीज़ का उपयोग कर सकते हैं।

अगर किसी के पास एक और विचार है तो मुझे यह सुनकर खुशी होगी।


0

मुझे लगता है कि टोकन में उसके अंदर एनकोड की गई सभी आवश्यक जानकारी शामिल होनी चाहिए, जो टोकन को मान्य करके प्रमाणीकरण करता है और जानकारी को डिकोड करके https://www.oauth.com/oauth2-servers/access-tokens/self-encoded-access-tokens/


-4
  1. सत्र Restless नहीं हैं
  2. क्या आपका मतलब है कि केवल http- उपयोग के लिए REST सेवा या मुझे गलत गलत मिला? कुकी-आधारित सत्र का उपयोग केवल स्वयं (!) Http- आधारित सेवाओं के लिए किया जाना चाहिए! (यह कुकी के साथ काम करने के लिए एक समस्या हो सकती है, उदाहरण के लिए मोबाइल / कंसोल / डेस्कटॉप / आदि से।)
  3. यदि आप 3D पार्टी डेवलपर्स के लिए RESTful सेवा प्रदान करते हैं, तो सुरक्षा के साथ समस्याओं से बचने के लिए कभी भी कुकी-आधारित सत्र का उपयोग न करें, टोकन का उपयोग करें।

3
प्रमाणीकरण टोकन रखने वाले सर्वर पर सत्र के लिए सत्र कुंजी संग्रहीत करने के लिए कुकी का उपयोग नहीं किया जाना चाहिए। लेकिन अगर कुकी प्रमाणीकरण टोकन रखती है तो यह एक संभव समाधान है। (बेशक कुकी httponly और सुरक्षित होना चाहिए)
roberkules
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.