tl; dr: सुरक्षा कारणों से यह सब होता है।
OAuth 2.0 इन दो मानदंडों को पूरा करना चाहता था:
- आप डेवलपर्स को गैर-HTTPS पुनर्निर्देशित URI का उपयोग करने की अनुमति देना चाहते हैं क्योंकि सभी डेवलपर्स के पास SSL सक्षम सर्वर नहीं है और यदि वे हमेशा इसे ठीक से कॉन्फ़िगर नहीं किया जाता है (गैर-स्व हस्ताक्षरित, विश्वसनीय एसएसएल प्रमाणपत्र, सिंक्रनाइज़ सर्वर घड़ी ...)।
- आप नहीं चाहते हैं कि हैकर्स अनुरोधों को रोककर पहुंच / ताज़ा टोकन चोरी करने में सक्षम हों।
नीचे दिए गए विवरण:
अंतर्निहित प्रवाह केवल सुरक्षा कारणों से ब्राउज़र वातावरण में संभव है:
में निहित प्रवाह पहुँच टोकन सीधे एक हैश टुकड़ा (नहीं के रूप में एक URL पैरामीटर) के रूप में पारित कर दिया है। हैश टुकड़ा के बारे में एक महत्वपूर्ण बात यह है कि, एक बार जब आप हैश टुकड़े से युक्त लिंक का पालन करते हैं, तो केवल ब्राउज़र ही हैश के टुकड़े के बारे में जानता है। ब्राउजर्स हैश के टुकड़े को सीधे गंतव्य वेबपेज (रीडायरेक्ट यूआरआई / क्लाइंट के वेबपेज) पर भेजेंगे। हैश के टुकड़े में निम्नलिखित गुण होते हैं:
- वे HTTP अनुरोध का हिस्सा नहीं हैं, इसलिए उन्हें सर्वर द्वारा नहीं पढ़ा जा सकता है और इस वजह से उन्हें मध्यस्थ सर्वर / राउटर द्वारा इंटरसेप्ट नहीं किया जा सकता है (यह महत्वपूर्ण है)।
- वे केवल ब्राउज़र पर मौजूद हैं - क्लाइंट साइड - इसलिए हैश टुकड़ा पढ़ने का एकमात्र तरीका पृष्ठ पर चलने वाले जावास्क्रिप्ट का उपयोग कर रहा है।
यह एक मध्यस्थ सर्वर से इंटरसेप्ट होने के जोखिम के बिना क्लाइंट को सीधे एक्सेस टोकन पास करना संभव बनाता है। इसके पास केवल संभावित ग्राहक पक्ष का विवरण है और एक्सेस टोकन का उपयोग करने के लिए जावास्क्रिप्ट रनिंग क्लाइंट साइड की आवश्यकता है।
निहित प्रवाह में सुरक्षा समस्याएं भी हैं जिन्हें वर्कअराउंड के लिए आगे तर्क की आवश्यकता होती है / उदाहरण के लिए बचें:
- एक हमलावर को एक अलग वेबसाइट / ऐप पर उपयोगकर्ता से एक्सेस टोकन मिल सकता है (मान लीजिए कि वह दूसरी वेबसाइट / ऐप का मालिक है), तो उनकी वेबसाइट पर टोकन लॉग इन करें, और फिर उसे अपनी वेबसाइट पर URL पैराम के रूप में पास करें इसलिए आपकी वेबसाइट पर उपयोगकर्ता को प्रतिरूपित करना। इससे बचने के लिए आपको एक्सेस टोकन से जुड़ी क्लाइंट आईडी (उदाहरण के लिए Google के लिए आप tokeninfo समापन बिंदु का उपयोग कर सकते हैं) की जांच करने के लिए यह सुनिश्चित करने के लिए कि टोकन अपने स्वयं के क्लाइंट आईडी (यानी अपने स्वयं के ऐप द्वारा) के साथ जारी किया गया था या हस्ताक्षर की जांच करें यदि आप एक IDToken का उपयोग कर रहे हैं (लेकिन इसके लिए आपके ग्राहक की आवश्यकता है)।
- यदि आपके स्वयं की संपत्ति (जिसे सेशन फिक्सेशन अटैक कहा जाता है) से ऑर्टिकल रिक्वेस्ट की उत्पत्ति नहीं हुई है, तो इससे बचने के लिए आप अपनी वेबसाइट से एक यादृच्छिक हैश जेनरेट करना चाहेंगे, इसे कुकी में सेव करेंगे और उसी हैश को राज्य के URL में पास करेंगे जब उपयोगकर्ता वापस आता है, तो आप अनुरोध करते हैं कि कुकी के साथ राज्य की जाँच करें और यह मेल खाना चाहिए।
में प्राधिकरण कोड प्रवाह यह क्योंकि URL पैरामीटर HTTP अनुरोध का हिस्सा है, इसलिए किसी भी मध्यस्थ सर्वर / रूटर है जिसके द्वारा आपके अनुरोध से होकर गुजरेगा (सैकड़ों हो सकता है) करने में सक्षम हो सकता है एक पहुँच एक URL पैरामीटर में सीधे टोकन पारित करने के लिए संभव नहीं है यदि आप एन-एन्क्रिप्टेड कनेक्शन (HTTPS) का उपयोग नहीं कर रहे हैं, तो एक्सेस टोकन को पढ़ें जो कि मैन-इन-द-बीच हमलों के रूप में जाना जाता है।
सीधे URL URL में पहुंच टोकन पास करना सिद्धांत रूप में संभव हो सकता है, लेकिन ऑर्किटेक्ट को यह सुनिश्चित करना होगा कि पुनर्निर्देशित यूआरआई टीएलएस एन्क्रिप्शन और 'विश्वसनीय' एसएसएल प्रमाणपत्र के साथ HTTPS का उपयोग कर रहा है (आमतौर पर एक प्रमाणपत्र प्राधिकरण से जो मुक्त नहीं है। यह सुनिश्चित करने के लिए कि गंतव्य सर्वर वैध है और HTTP अनुरोध पूरी तरह से एन्क्रिप्टेड है। सभी डेवलपर्स एक एसएसएल प्रमाणपत्र खरीदते हैं और अपने डोमेन पर एसएसएल को ठीक से कॉन्फ़िगर करते हैं, एक बहुत बड़ा दर्द होगा और यह जबरदस्त रूप से गोद लेगा। यही कारण है कि एक मध्यस्थ एक-बार-उपयोग "प्राधिकरण कोड" प्रदान किया जाता है कि केवल वैध रिसीवर विनिमय करने में सक्षम होगा (क्योंकि आपको ग्राहक गुप्त की आवश्यकता है) और यह कोड अनपेक्षित लेनदेन पर अनुरोधों को बाधित करने वाले संभावित हैकर्स के लिए बेकार होगा। (क्योंकि वे डॉन '
आप यह भी तर्क दे सकते हैं कि निहित प्रवाह कम सुरक्षित है, संभावित हमलावर वैक्टर हैं जैसे डोमेन को रीडायरेक्ट करने पर डोमेन को खराब करना - उदाहरण के लिए क्लाइंट की वेबसाइट के आईपी पते को हाईजैक करके। यह एक कारण है कि अंतर्निहित प्रवाह केवल टोकन तक पहुंच प्राप्त करता है (जो कि सीमित समय के उपयोग के लिए माना जाता है) और कभी भी टोकन ताज़ा नहीं करते हैं (जो समय में असीमित हैं)। इस समस्या को दूर करने के लिए, मैं आपको सलाह देता हूं कि जब भी संभव हो, अपने वेबपेजों को एक HTTPS- सक्षम सर्वर पर होस्ट करें।