हाय ने पहले ही इस अवलोकन और प्रश्न को this question पर लिखा था, लेकिन बाद में ही देखा कि यह एक पुराना और "मृत" प्रश्न था। जैसा कि मैं वास्तव में दूसरों से कुछ अंतर्दृष्टि पसंद करता हूं, मैं इसे एक नए प्रश्न के रूप में दोबारा पोस्ट कर रहा हूं।वेब अनुप्रयोगों के लिए रीस्टफुल प्रमाणीकरण
प्रमाणीकरण कैसे करें, इस सवाल के जवाब में, लोग आम तौर पर उत्साहित रूप से "HTTP प्रमाणीकरण" चिल्लाते हैं। हालांकि, मुझे संदेह है कि क्या उन्होंने कभी भी ब्राउज़र आधारित एप्लिकेशन (मशीन-टू-मशीन वेब सेवा के बजाय) को आरईएसटी के साथ बनाने की कोशिश की है। (कोई अपराध का इरादा - मैं तो बस नहीं लगता कि वे कभी भी जटिलताओं का सामना करना पड़ा)
समस्याएं है कि मैं RESTful सेवाओं है कि HTML पृष्ठों एक ब्राउज़र में देखा जा करने के लिए उत्पादन पर HTTP प्रमाणीकरण का उपयोग कर के साथ पाए जाते हैं:
- उपयोगकर्ता को आम तौर पर एक बदसूरत ब्राउज़र से बना लॉगिन बॉक्स मिलता है, जो उपयोगकर्ता को असभ्य रूप से उभरा है। आप पासवर्ड पुनर्प्राप्ति, सहायता बॉक्स, आदि नहीं जोड़ सकते हैं। लॉग आउट होने या एक अलग नाम से में प्रवेश करने
- एक समस्या है - ब्राउज़रों जब तक आप विंडो को बंद
- समय समाप्ति मुश्किल हो जाता है साइट के लिए प्रमाणीकरण जानकारी भेजने रखेंगे
एक बहुत ही व्यावहारिक लेख है कि इन बिंदु tackles बिंदु द्वारा here है, लेकिन यह परिणाम बहुत-से ब्राउज़र-विशिष्ट जावास्क्रिप्ट हैकरी के पर काम करता है, कामकाज के लिए कामकाज, आदि। इस प्रकार, यह आगे-संगत नहीं है, इसलिए निरंतर रखरखाव की आवश्यकता होगी क्योंकि नए ब्राउज़र जारी किए जाते हैं। मैं उस साफ और स्पष्ट डिजाइन पर विचार नहीं करता हूं, साथ ही मुझे लगता है कि यह बहुत अधिक काम और सिरदर्द है ताकि मैं उत्साही रूप से अपने दोस्तों को अपना आरईएसटी-बैज दिखा सकूं।
मुझे विश्वास है कि कुकीज़ समाधान हैं। लेकिन रुको, कुकीज़ बुराई है, है ना? नहीं, वे नहीं हैं, कुकीज़ का उपयोग करने के तरीके अक्सर बुराई है। एक कुकी स्वयं क्लाइंट-साइड जानकारी का एक टुकड़ा है, बस HTTP प्रमाणीकरण जानकारी की तरह ही ब्राउज़र ब्राउज़ करते समय ट्रैक रखेगा। और क्लाइंट-साइड जानकारी का यह टुकड़ा सर्वर पर प्रत्येक अनुरोध पर भेजा जाता है, फिर से जैसे ही HTTP प्रमाणीकरण जानकारी होगी। संकल्पनात्मक रूप से, केवल अंतर यह है कि सामग्री क्लाइंट-साइड स्टेट के इस टुकड़े के सर्वर द्वारा इसकी प्रतिक्रिया के हिस्से के रूप में निर्धारित किया जा सकता है।
सत्र सिर्फ निम्नलिखित नियमों के साथ एक RESTful संसाधन बनाने द्वारा:
- एक सत्र एक प्रयोक्ता आईडी के लिए एक महत्वपूर्ण (और संभवतः समय समाप्ति के लिए एक आखिरी एक्शन टाइमस्टैम्प) नक्शे
- तो एक सत्र मौजूद है, तो इसका मतलब है कि कुंजी मान्य है।
- लॉगिन/सत्र के लिए पोस्टिंग का मतलब है, एक नई कुंजी
- लॉगआउट का मतलब है एक कुकी के रूप में सेट किया गया है हटाने से/सत्र/{कुंजी} (अतिभारित पोस्ट, याद है, हमने एक ब्राउज़र रहे हैं और एचटीएमएल 5 के लिए एक लंबा रास्ता है साथ अभी तक जाना)
- प्रमाणीकरण हर अनुरोध पर एक कुकी के रूप में कुंजी भेजने और जाँच सत्र मौजूद है और वैध है या नहीं द्वारा किया जाता है
HTTP प्रमाणीकरण के लिए फर्क सिर्फ इतना है, अब, कि प्रमाणीकरण कुंजी उत्पन्न किया जाता है सर्वर द्वारा और क्लाइंट को भेजा जाता है जो इसे वापस भेजता रहता है, क्लाइंट की बजाय दर्ज किए गए क्रेडेंशियल्स से इसकी गणना करता है।
मुझे लगता है कि यह एक पर्याप्त समाधान है जो ठीक काम करता है, लेकिन मुझे यह स्वीकार करना होगा कि मैं इस योजना में संभावित छेद की पहचान करने के लिए पर्याप्त सुरक्षा विशेषज्ञ नहीं हूं - मुझे पता है कि सैकड़ों गैर-भरोसेमंद वेब अनुप्रयोग अनिवार्य रूप से एक ही लॉगिन प्रोटोकॉल का उपयोग करें ($ _SESSION inphp, j2ee में HttpSession, आदि)। कुकी हेडर सामग्री का उपयोग सर्वर-साइड संसाधन को संबोधित करने के लिए किया जाता है, जैसे अनुवाद संसाधनों, इत्यादि तक पहुंचने के लिए स्वीकार्य भाषा का उपयोग किया जा सकता है। मुझे लगता है कि यह वही है, लेकिन शायद दूसरों को नहीं? तुम लोग क्या सोचते हो?
अरे, आपके उत्तर के लिए धन्यवाद! हालांकि, मैं सहमत नहीं हूं कि एक सत्र का खुलासा करने का मतलब है कि आप सर्वर पर ग्राहक स्थिति रखते हैं। एक सत्र "यह विश्वास है कि जो कुछ भी जानता है वह यू यू यू है", जो स्पष्ट रूप से सर्वर द्वारा आयोजित एक धारणा है। निश्चित रूप से, यह बहुत स्थिर डेटा नहीं है क्योंकि सत्र जल्दी से अमान्य हो जाते हैं, लेकिन किसने कहा कि सर्वर राज्य स्थिर होना चाहिए? एक शानदार शॉपिंग कार्ट सिस्टम की तुलना करें। मेरी सबसे बड़ी चिंता वास्तव में है, "कुंजी कुंजी होने का मतलब है कि सर्वर आपके उपयोगकर्ता यू को सोचता है" मुझे बहुत असुरक्षित लगता है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। – skrebbel
एक बहुत ही रोचक बिंदु। फिर भी, रीस्टफुल प्रोग्रामिंग का आधारशिला यह है कि कोई सर्वर से क्लाइंट/एप्लिकेशन स्कोप जानकारी रखने के लिए नहीं कहता है। संसाधन अनुरोध, "सर्वर पर किसी संग्रहीत संदर्भ का लाभ नहीं उठा सकता"। मुझे वास्तव में संसाधन के रूप में ग्राहक राज्य के इस विचार को पसंद है, लेकिन मुझे विश्वास है कि यह आरईएसटी सिद्धांतों का स्पष्ट उल्लंघन है। – codemonkey
मैंने कभी समझा नहीं है कि रीस्टफुल स्पेस स्टेटलेसनेस के बारे में इतना अशिष्ट क्यों है, भले ही उपयोगकर्ता ऑथ की बात आती है। पेराफ्स आप कुछ प्रकाश डाल सकते हैं। असल में, एकमात्र उदाहरण जिसमें मैं "उल्लंघन" करूँगा वह उपयोगकर्ता है क्योंकि मैं अपने एपीआई को ग्लासफ़िश से बाहर चलाने की योजना बना रहा हूं और उपयोगकर्ता सत्रों का ट्रैक रखता हूं। यदि कोई सत्र खुला नहीं होता है, तो ग्राहक को संबंधित रिटर्न कोड मिलता है और फिर वह पाचन लेख के माध्यम से प्रमाण-पत्र सबमिट कर सकता है। एक बार जब वह प्रमाणीकृत हो जाता है, तो सत्र समाप्त होने तक वह सत्र में जाने के लिए अच्छा होता है, यानी प्रत्येक आरईएसटी अनुरोध पर कोई पुनः प्रमाणीकरण नहीं होता है। मुझे लगता है कि यह एक उचित समझौता है – amphibient