http headers - क्या 401 अनधिकृत और पुनर्निर्देशित(एक स्थान के साथ) भेजना संभव है?




http-headers http-status-code-401 (5)

मैं 401 Unauthorized और क्लाइंट को कहीं न कहीं पुनर्निर्देशित करना चाहूंगा। हालाँकि:

अगर मैं इसे इस तरह करता हूं:

header('HTTP/1.1 401 Unauthorized');
header('Location: /');

सर्वर Location साथ 302 Found भेजता है, इसलिए 401 Unauthorized नहीं है।

अगर मैं इसे इस तरह करता हूं:

header('Location: /');
header('HTTP/1.1 401 Unauthorized');

ब्राउज़र 401 Unauthorized और Location दोनों प्राप्त करता है, लेकिन पुनर्निर्देशित नहीं करता है।

(IE 9 और क्रोम 16 एक ही व्यवहार करते हैं, इसलिए मैं अनुमान लगा रहा हूं कि यह सही है)

शायद मैं HTTP का दुरुपयोग कर रहा हूँ? मुझे लगता है कि मेरा ऐप इंटरफ़ेस सभी ग्राहकों के लिए बिल्कुल समान होगा: पाठ ब्राउज़र, आधुनिक ब्राउज़र, एपीआई कॉल आदि। 401 + प्रतिक्रिया पाठ एक एपीआई उपयोगकर्ता को बताएगा कि क्या है। पुनर्निर्देश एक ब्राउज़र के लिए उपयोगी है।

क्या कोई (अच्छा) तरीका है?


आप 401 भेज सकते हैं और फिर प्रतिक्रिया निकाय में आप window.location = 'domain.com' भेज सकते हैं। हालांकि, उपयोगकर्ता को यह जानकर बिना बताए तुरंत भेज दिया जाएगा कि 401 हुआ।


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

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


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

टेस्ट केस 1: फेसबुक

404 Not Found की प्रतिक्रिया में लॉग आउट करते समय एक संरक्षित फेसबुक पेज (मेरी उपयोगकर्ता प्रोफ़ाइल) पर नेविगेट करना। फेसबुक एक सामान्य उद्देश्य "यह पृष्ठ उपलब्ध नहीं है" पृष्ठ पर कार्य करता है, जिसमें एक लॉगिन फ़ॉर्म भी शामिल है। दिलचस्प। और भी दिलचस्प: जब मैं "ईवेंट" पृष्ठ पर जाता हूं, तो मुझे 302 प्रतिसाद दिया जाता है, जो एक प्रवेश पृष्ठ (जो 200 प्रतिसाद देता है) के लिए आगे होता है। इसलिए मुझे लगता है कि उनका विचार उन पृष्ठों के लिए 302 को वापस करना है जो हम जानते हैं कि मौजूद हैं, लेकिन उन पृष्ठों के लिए 404 परोसें जो मौजूद हो सकते हैं या हो सकते हैं (उदाहरण के लिए उपयोगकर्ता की गोपनीयता की रक्षा के लिए)।

टेस्ट केस 2: Google इनबॉक्स

जब मैं लॉग आउट हो जाता हूं तो मेरे इनबॉक्स में नेविगेट करना 302 और फेसबुक के समान मुझे लॉगिन पृष्ठ पर भेज देता है। मैं यह जानने में सक्षम नहीं था कि मेरी Google+ प्रोफ़ाइल को निजी कैसे बनाया जाए ताकि कोई परीक्षण डेटा न हो ...

टेस्ट केस 3: Amazon.com

जब मैं लॉग आउट हो जाता हूं तो मेरे ऑर्डर इतिहास में नेविगेट करना 302 देता है और मुझे पहले की तरह लॉगिन पृष्ठ पर भेज देता है। अमेज़ॅन के पास "प्रोफ़ाइल" पृष्ठ की कोई अवधारणा नहीं है, इसलिए मैं यहां परीक्षण नहीं कर सकता।

अगर यहां पर उपयोगकर्ता को लॉग इन करने की आवश्यकता होती है (हालाँकि मैं 303 बहस करूँगा अन्य देखें वास्तव में अधिक उपयुक्त है), तो परीक्षण के मामलों को संक्षेप में प्रस्तुत करने के लिए, 302 पाया और लॉगिन पृष्ठ पर फॉरवर्ड करना सबसे अच्छा अभ्यास है। यह केवल उस मामले में है, जहां एक वास्तविक मानव उपयोगकर्ता को HTML रूप में उपयोगकर्ता नाम और पासवर्ड इनपुट करने की आवश्यकता होती है। अन्य प्रकार के प्रमाणीकरण के लिए (जैसे। बुनियादी, एपीआई कुंजी, आदि), 401 अनधिकृत स्पष्ट रूप से उपयुक्त प्रतिक्रिया है। इस मामले में एक लॉगिन पृष्ठ पर अग्रेषित करने की आवश्यकता नहीं है।


यहाँ एक साफ तरीका है:

401 पृष्ठ पर, आप अनुरोध में "स्वीकार" शीर्षक के आधार पर भेजने के लिए "दृश्य" चुन सकते हैं।

यदि स्वीकार application/json , तो आप शरीर को शामिल कर सकते हैं:

{"status":401;"message":"Authentication required"}

यदि "स्वीकार" text/html , तो आप शरीर को शामिल कर सकते हैं:

<form action="/signin" method="post">
    <!-- bla bla -->
    <input type="hidden" name="redirect" value="[URL ENCODE REQUEST URI]">
</form>

फिर आप एक ही सवाल में भाग लेते हैं ... क्या आप एक सफल लॉगिन पर 200 OK या 302 Found ? (देखिए मैंने यहां क्या किया? )

यदि आप किसी भी पृष्ठ पर प्रमाणीकरण को संभाल सकते हैं, तो आप प्रपत्र कार्रवाई को उसी पृष्ठ URL के रूप में देख सकते हैं , लेकिन XSS को देखने के लिए यदि आप उपयोगकर्ता को request_uri को क्रिया क्रिया विशेषता में डाल रहे हैं।


3xx अर्थ है पुनर्निर्देशित
4xx मतलब है कि ब्राउज़र ने कुछ गलत किया है।

वहाँ एक कारण है कि कोड को जिस तरह से विभाजित किया जाता है - वे मिश्रण नहीं करते हैं;)





http-redirect