2009-07-16 17 views
24

हाय ने पहले ही इस अवलोकन और प्रश्न को this question पर लिखा था, लेकिन बाद में ही देखा कि यह एक पुराना और "मृत" प्रश्न था। जैसा कि मैं वास्तव में दूसरों से कुछ अंतर्दृष्टि पसंद करता हूं, मैं इसे एक नए प्रश्न के रूप में दोबारा पोस्ट कर रहा हूं।वेब अनुप्रयोगों के लिए रीस्टफुल प्रमाणीकरण

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

समस्याएं है कि मैं RESTful सेवाओं है कि HTML पृष्ठों एक ब्राउज़र में देखा जा करने के लिए उत्पादन पर HTTP प्रमाणीकरण का उपयोग कर के साथ पाए जाते हैं:

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

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

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

सत्र सिर्फ निम्नलिखित नियमों के साथ एक RESTful संसाधन बनाने द्वारा:

  • एक सत्र एक प्रयोक्ता आईडी के लिए एक महत्वपूर्ण (और संभवतः समय समाप्ति के लिए एक आखिरी एक्शन टाइमस्टैम्प) नक्शे
  • तो एक सत्र मौजूद है, तो इसका मतलब है कि कुंजी मान्य है।
  • लॉगिन/सत्र के लिए पोस्टिंग का मतलब है, एक नई कुंजी
  • लॉगआउट का मतलब है एक कुकी के रूप में सेट किया गया है हटाने से/सत्र/{कुंजी} (अतिभारित पोस्ट, याद है, हमने एक ब्राउज़र रहे हैं और एचटीएमएल 5 के लिए एक लंबा रास्ता है साथ अभी तक जाना)
  • प्रमाणीकरण हर अनुरोध पर एक कुकी के रूप में कुंजी भेजने और जाँच सत्र मौजूद है और वैध है या नहीं द्वारा किया जाता है

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

मुझे लगता है कि यह एक पर्याप्त समाधान है जो ठीक काम करता है, लेकिन मुझे यह स्वीकार करना होगा कि मैं इस योजना में संभावित छेद की पहचान करने के लिए पर्याप्त सुरक्षा विशेषज्ञ नहीं हूं - मुझे पता है कि सैकड़ों गैर-भरोसेमंद वेब अनुप्रयोग अनिवार्य रूप से एक ही लॉगिन प्रोटोकॉल का उपयोग करें ($ _SESSION inphp, j2ee में HttpSession, आदि)। कुकी हेडर सामग्री का उपयोग सर्वर-साइड संसाधन को संबोधित करने के लिए किया जाता है, जैसे अनुवाद संसाधनों, इत्यादि तक पहुंचने के लिए स्वीकार्य भाषा का उपयोग किया जा सकता है। मुझे लगता है कि यह वही है, लेकिन शायद दूसरों को नहीं? तुम लोग क्या सोचते हो?

उत्तर

4

एक दिलचस्प सवाल है। मैं अभी एक आरईएसटी एपीआई कार्यान्वयन खत्म कर रहा हूं - mod_rewrite और PHP का उपयोग किया। यह एचटीटीपीएस में HTTP मूल लेख का उपयोग करता है। अब तक हम पाम प्री क्लाइंट पर काम कर रहे हैं। उस ग्राहक को विकसित करने वाला व्यक्ति प्रत्येक अनुरोध के साथ सबमिट करने के लिए उपयोगकर्ता प्रमाण-पत्रों का ट्रैक रखने के लिए थोड़ा सा बंद कर दिया गया था।

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

फ़ायरफ़ॉक्स टूल के लिए REST क्लाइंट उपयोगी टूल मिला है ... लेकिन जब भी मैं इसका उपयोग कर रहा हूं तब भी मैं मानक ब्राउज़र पॉपअप में अपने क्रेडेंशियल दर्ज करता हूं।

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

... 10/23/2012 पर इस को जोड़ने ...

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

+1

अरे, आपके उत्तर के लिए धन्यवाद! हालांकि, मैं सहमत नहीं हूं कि एक सत्र का खुलासा करने का मतलब है कि आप सर्वर पर ग्राहक स्थिति रखते हैं। एक सत्र "यह विश्वास है कि जो कुछ भी जानता है वह यू यू यू है", जो स्पष्ट रूप से सर्वर द्वारा आयोजित एक धारणा है। निश्चित रूप से, यह बहुत स्थिर डेटा नहीं है क्योंकि सत्र जल्दी से अमान्य हो जाते हैं, लेकिन किसने कहा कि सर्वर राज्य स्थिर होना चाहिए? एक शानदार शॉपिंग कार्ट सिस्टम की तुलना करें। मेरी सबसे बड़ी चिंता वास्तव में है, "कुंजी कुंजी होने का मतलब है कि सर्वर आपके उपयोगकर्ता यू को सोचता है" मुझे बहुत असुरक्षित लगता है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। – skrebbel

+0

एक बहुत ही रोचक बिंदु। फिर भी, रीस्टफुल प्रोग्रामिंग का आधारशिला यह है कि कोई सर्वर से क्लाइंट/एप्लिकेशन स्कोप जानकारी रखने के लिए नहीं कहता है। संसाधन अनुरोध, "सर्वर पर किसी संग्रहीत संदर्भ का लाभ नहीं उठा सकता"। मुझे वास्तव में संसाधन के रूप में ग्राहक राज्य के इस विचार को पसंद है, लेकिन मुझे विश्वास है कि यह आरईएसटी सिद्धांतों का स्पष्ट उल्लंघन है। – codemonkey

+0

मैंने कभी समझा नहीं है कि रीस्टफुल स्पेस स्टेटलेसनेस के बारे में इतना अशिष्ट क्यों है, भले ही उपयोगकर्ता ऑथ की बात आती है। पेराफ्स आप कुछ प्रकाश डाल सकते हैं। असल में, एकमात्र उदाहरण जिसमें मैं "उल्लंघन" करूँगा वह उपयोगकर्ता है क्योंकि मैं अपने एपीआई को ग्लासफ़िश से बाहर चलाने की योजना बना रहा हूं और उपयोगकर्ता सत्रों का ट्रैक रखता हूं। यदि कोई सत्र खुला नहीं होता है, तो ग्राहक को संबंधित रिटर्न कोड मिलता है और फिर वह पाचन लेख के माध्यम से प्रमाण-पत्र सबमिट कर सकता है। एक बार जब वह प्रमाणीकृत हो जाता है, तो सत्र समाप्त होने तक वह सत्र में जाने के लिए अच्छा होता है, यानी प्रत्येक आरईएसटी अनुरोध पर कोई पुनः प्रमाणीकरण नहीं होता है। मुझे लगता है कि यह एक उचित समझौता है – amphibient

1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे लगता है कि यहां विभिन्न प्रश्नों को संबोधित किया गया है।विशेष रूप से, मुझे लगता है कि OAuth 2.0 Protocol इन सवालों में से कई पर विचार कर रहा है; मैं यहां उनके उत्तरों का सारांश प्रदान करने के लिए पर्याप्त आधिकारिक महसूस नहीं करता हूं, लेकिन लिंक की गई साइट में स्पष्ट रूप से अलग-अलग उपयोग किए जाने वाले मामलों का उपयोग किया गया है, जो इस प्रश्न के लिए बहुत उपयोगी लगता है, भले ही पूर्ण OAuth 2.0 वास्तव में आवश्यक न हो यहाँ।

संबंधित मुद्दे