प्रतिष्ठित लॉगिन विफलता: 401 या कस्टम रिस्पांस लौटाएं


103

यह एक वैचारिक प्रश्न है।

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

इस वेब सेवा में अन्य सभी प्रतिक्रियाएं JSON प्रारूप में प्रदान की जाती हैं।

सवाल यह है कि जब मैं वेब सेवा को केवल यह पता लगाने के लिए बताता हूं कि क्या दिया गया उपयोगकर्ता नाम / पासवर्ड वैध है, तो क्या वेब सेवा को हमेशा JSON डेटा का जवाब देना चाहिए जो मुझे इसका सफल या असफल बता रहा है, या क्या यह HTTP 200 को अच्छे क्रेडेंशियल और HTTP पर वापस करना चाहिए 401 खराब साख पर।

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

एक और रास्ता रखो, यह मुझे लगता है कि एक अनुरोध की तरह है:

myservice.com/this/is/a/user/action 

खराब क्रेडेंशियल प्रदान किए जाने पर 401 को वापस करना चाहिए। लेकिन एक अनुरोध की तरह:

myservice.com/are/these/credentials/valid

401 को कभी वापस नहीं करना चाहिए क्योंकि वह विशेष URL (अनुरोध) वैध क्रेडेंशियल के साथ या उसके बिना अधिकृत है।

मैं इस पर कुछ न्यायसंगत राय सुनना चाहता हूं। इसे संभालने का मानक तरीका क्या है, और क्या यह तार्किक रूप से निपटने का मानक तरीका है?

जवाबों:


128

सबसे पहले। 401 एक असफल लॉगिन होने पर भेजने के लिए उचित प्रतिक्रिया कोड है।

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

myservice.com/are/these/credentials/valid401 के बारे में आपका भ्रम, जब आप सिर्फ एक चेक करते हैं, तो मुझे लगता है कि इस तथ्य पर आधारित है कि REST में अक्सर बूलियन अनुरोध करना Restful बाधाओं द्वारा गलत है। प्रत्येक अनुरोध को एक संसाधन वापस करना चाहिए। एक RESTful सेवा में बूलियन प्रश्न करना RPC के लिए एक फिसलन ढलान है।

अब मुझे नहीं पता कि आपने जो सेवाएं देखीं, वह कैसा व्यवहार कर रही हैं। लेकिन इसे हल करने का एक अच्छा तरीका खाता वस्तु की तरह कुछ है, जिसे आप प्राप्त करने की कोशिश करते हैं। यदि आप क्रेडेंशियल सही हैं, तो आपको खाता ऑब्जेक्ट मिल जाएगा, यदि आप बैंडविड्थ को केवल "चेक" करने के लिए बर्बाद नहीं करना चाहते हैं तो आप उसी संसाधन पर एक हेड कर सकते हैं।

एक खाता वस्तु भी उन सभी pesky बूलियन मूल्यों को संग्रहीत करने के लिए एक अच्छी जगह है जो अन्यथा के लिए व्यक्तिगत संसाधन बनाने के लिए मुश्किल होगा।


2
संसाधनों की वापसी के बारे में आपकी बात वैध लगती है और शायद यही सही कदम है। यह बताने के लिए कि 401 उचित प्रतिक्रिया है, मैं वहाँ कुछ स्पष्टीकरण की सराहना करता हूँ। मैंने HTTP युक्ति पढ़ी है, जैसा कि आपने यहां शामिल किया है, लेकिन यह मेरे लिए आपके दावे की प्रत्यक्ष और स्पष्ट पुष्टि के रूप में नहीं पढ़ा है। अर्थात्, प्रमाणिकता की वैधता के बारे में पूछने के लिए प्रमाणीकरण की आवश्यकता नहीं है - फिर भी आपने जो शामिल किया है वह "प्रमाणीकरण के लिए विशेष रूप से उपयोग के लिए आवश्यक है।"
मैट

3
इसे देखने का आपका तरीका सही है। आपको अपने खाता ऑब्जेक्ट के लिए पूछने में सक्षम होने के लिए प्रमाणित होने की आवश्यकता नहीं है। लेकिन आपको संसाधन प्राप्त करने में सक्षम होने के लिए सफलतापूर्वक प्रमाणित करने की आवश्यकता है, और जहां authentication is required and has failed or has not yet been providedलागू होता है, वहीं आप क्रेडेंशियल्स की वैधता के लिए नहीं पूछते हैं, लेकिन आपके द्वारा आपूर्ति किए जाने वाले क्रेडेंशियल्स के आधार पर एक विशिष्ट संसाधन के लिए।
मौलवी

2
मैं समझता हूं कि आप "चेक-कॉल" क्यों करना चाहते हैं और उसके लिए, मैं अभी भी 401 को एक विफल प्रमाणीकरण के लिए उपयुक्त प्रतिक्रिया कोड के रूप में बढ़ावा दूंगा, भले ही कॉल को कॉल करने योग्य होने के लिए प्रमाणीकरण की आवश्यकता न हो। कोई 204 सामग्री भी उपयुक्त नहीं हो सकती है, लेकिन थोड़ा अस्पष्ट रूप से महसूस होता है।
मौलवी

4
मैं नहीं देखता कि यह कैसे सही हो सकता है, जब तक कि आप बेसिक या डाइजेस्ट प्रमाणीकरण का उपयोग नहीं कर रहे हैं। कल्पना के उद्धृत भाग के अनुसार: "प्रतिक्रिया में एक WWW-Authenticate शामिल होना चाहिए" - और यदि आप धारा 14.47 का उल्लेख करते हैं: "HTTP एक्सेस प्रमाणीकरण प्रक्रिया" HTTP प्रमाणीकरण: मूल और डाइजेस्ट एक्सेस प्रमाणीकरण "में वर्णित है। इसका तात्पर्य है। यदि आप विशिष्ट ईमेल / पासवर्ड सत्यापन का उपयोग कर रहे हैं तो मेरे लिए 401 उपयुक्त नहीं है।
जोनाह

1
मुझे लगता है कि यह गलत हो सकता है, मैं वेब और मोबाइल दोनों पर ग्राहकों को लागू कर रहा हूं और मैं लॉगिन स्क्रीन पर रीडायरेक्ट करने के लिए 401 को इंटरसेप्ट करता हूं। लेकिन जब कोई पहले से ही लॉगिन स्क्रीन पर है और गलत क्रेडेंशियल सबमिट करता है, तो प्रतिक्रिया में 401 भी है और फिर से पुनर्निर्देशित करने का प्रयास करेगा। स्पष्ट रूप से प्रयास करने पर प्रमाणित करने के असफल प्रयास के लिए एक अलग स्थिति कोड होना चाहिए। शायद एक बुरा अनुरोध या यहां तक ​​कि सर्वर त्रुटि?
जफेट ओन्गेरी - इंकलामेवा

28

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

मानक के अनुसार यहाँ https://www.w3.org/Protocols/rfc2616/rfc2616-sec.in.html

* 10.4.2 401 अनधिकृत

अनुरोध को उपयोगकर्ता प्रमाणीकरण की आवश्यकता है। अनुरोधित संसाधन पर लागू चुनौती के साथ प्रतिक्रिया के लिए डब्ल्यूडब्ल्यूडब्ल्यू-ऑथेंटिकेट हेडर फ़ील्ड (सेक्शन 14.47) शामिल होना चाहिए। क्लाइंट MAY एक उपयुक्त प्राधिकरण शीर्ष लेख क्षेत्र (खंड 14.8) के साथ अनुरोध को दोहराता है। यदि अनुरोध में पहले से ही प्राधिकरण क्रेडेंशियल शामिल हैं, तो 401 प्रतिक्रिया इंगित करती है कि प्रमाणीकरण उन क्रेडेंशियल्स के लिए मना कर दिया गया है। यदि 401 प्रतिक्रिया में पूर्व प्रतिक्रिया के समान चुनौती होती है, और उपयोगकर्ता एजेंट ने पहले से ही कम से कम एक बार प्रमाणीकरण का प्रयास किया है, तो उपयोगकर्ता को उस इकाई को प्रस्तुत किया जाना चाहिए जो प्रतिक्रिया में दी गई थी, क्योंकि उस इकाई में प्रासंगिक नैदानिक ​​जानकारी शामिल हो सकती है। HTTP एक्सेस ऑथेंटिकेशन को "HTTP ऑथेंटिकेशन: बेसिक एंड डाइजेस्ट एक्सेस ऑथेंटिकेशन" [43] * में समझाया गया है।


8
मैं इस पर आपसे सहमत हूं, लेकिन भेजने के लिए वैकल्पिक प्रतिक्रिया की स्थिति क्या है? मैं वेब और मोबाइल दोनों पर क्लाइंट लागू कर रहा हूं और मैं लॉगिन स्क्रीन पर रीडायरेक्ट करने के लिए 401 को इंटरसेप्ट करता हूं। लेकिन जब कोई पहले से ही लॉगिन स्क्रीन पर है और गलत क्रेडेंशियल सबमिट करता है, तो प्रतिक्रिया में 401 भी है और फिर से पुनर्निर्देशित करने की कोशिश करेगा ... आप क्या करेंगे?
जफथ ओन्गेरी - इंकलामेवा

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