OAuth 2.0: लाभ और उपयोग के मामले - क्यों?


256

क्या कोई समझा सकता है कि OAuth2 के बारे में क्या अच्छा है और हमें इसे क्यों लागू करना चाहिए? मैं पूछता हूँ क्योंकि मैं इसके बारे में थोड़ा उलझन में हूँ - यहाँ मेरे वर्तमान विचार हैं:

OAuth1 (अधिक सटीक HMAC) अनुरोध तार्किक, समझने में आसान, विकसित करने में आसान और वास्तव में सुरक्षित हैं।

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

और एक और एक्सेस टोकन प्राप्त करने के लिए, आप एक ताज़ा टोकन का उपयोग करते हैं जो एक्सेस टोकन के रूप में उसी समय पास किया गया था। क्या यह सुरक्षा के दृष्टिकोण से पहुँच को व्यर्थ बनाता है?

इसके अलावा, जैसा कि / r / netsec ने हाल ही में दिखाया है, एसएसएल पूरी तरह से सुरक्षित नहीं है, इसलिए एक सुरक्षित एचएमएसी के बजाय टीएलएस / एसएसएल पर सब कुछ प्राप्त करने के लिए धक्का मुझे भ्रमित करता है।

OAuth तर्क दे रहा है कि यह लगभग 100% सुरक्षा नहीं है, लेकिन इसे प्रकाशित और समाप्त किया जा रहा है। यह बिल्कुल प्रदाता के दृष्टिकोण से आशाजनक ध्वनि नहीं है। मैं देख सकता हूं कि 6 अलग-अलग प्रवाह का उल्लेख करते समय ड्राफ्ट क्या हासिल करने की कोशिश कर रहा है, लेकिन यह सिर्फ मेरे सिर में एक साथ फिट नहीं है।

मुझे लगता है कि यह समझने के लिए अधिक संघर्षरत हो सकता है कि यह वास्तव में इसे नापसंद करने की तुलना में लाभ और तर्क है, इसलिए यह थोड़ा अनुचित हमला हो सकता है, और अगर यह एक शेख़ी की तरह लग सकता है तो क्षमा करें।


जवाबों:


324

पृष्ठभूमि: मैंने OAuth 1.0a और 2.0 के लिए क्लाइंट और सर्वर स्टैक लिखे हैं।

OAuth 1.0a और 2.0 दोनों दो-पैर वाले प्रमाणीकरण का समर्थन करते हैं , जहां एक सर्वर को उपयोगकर्ता की पहचान और तीन-पैर वाले प्रमाणीकरण का आश्वासन दिया जाता है, जहां एक सर्वर को उपयोगकर्ता की पहचान के सामग्री प्रदाता द्वारा आश्वासन दिया जाता है। तीन-पैर वाला प्रमाणीकरण वह जगह है जहां प्राधिकरण अनुरोध और पहुंच टोकन खेल में आते हैं, और यह ध्यान रखना महत्वपूर्ण है कि OAuth 1 में वे भी हैं।

जटिल एक: तीन-पैर वाला प्रमाणीकरण

OAuth चश्मा का एक मुख्य बिंदु एक सामग्री प्रदाता (जैसे फेसबुक, ट्विटर, आदि) एक सर्वर को आश्वस्त करने के लिए है (उदाहरण के लिए एक वेब ऐप जो क्लाइंट की ओर से सामग्री प्रदाता से बात करना चाहता है) कि ग्राहक की कुछ पहचान है । तीन-पैर वाले प्रमाणीकरण की पेशकश वह क्षमता है जो उस ग्राहक या सर्वर के बिना उस पहचान के विवरण (जैसे उपयोगकर्ता नाम और पासवर्ड) को जानने की आवश्यकता होती है

OAuth के विवरण में बहुत गहरा हो रहा है;

  1. क्लाइंट सर्वर के लिए एक प्राधिकरण अनुरोध सबमिट करता है, जो यह पुष्टि करता है कि ग्राहक उसकी सेवा का एक वैध ग्राहक है।
  2. सर्वर क्लाइंट को अपने संसाधनों तक पहुंच का अनुरोध करने के लिए सामग्री प्रदाता को पुनर्निर्देशित करता है।
  3. सामग्री प्रदाता उपयोगकर्ता की पहचान को मान्य करता है, और अक्सर संसाधनों तक पहुंचने के लिए उनकी अनुमति का अनुरोध करता है।
  4. सामग्री प्रदाता क्लाइंट को सर्वर पर वापस ले जाता है, इसे सफलता या विफलता की सूचना देता है। इस अनुरोध में सफलता पर एक प्राधिकरण कोड शामिल है।
  5. सर्वर सामग्री प्रदाता के लिए एक आउट-ऑफ-बैंड अनुरोध करता है और एक्सेस टोकन के लिए प्राधिकरण कोड का आदान-प्रदान करता है।

सर्वर अब एक्सेस टोकन पास करके उपयोगकर्ता की ओर से सामग्री प्रदाता के लिए अनुरोध कर सकता है।

प्रत्येक एक्सचेंज (क्लाइंट-> सर्वर, सर्वर-> सामग्री प्रदाता) में एक साझा रहस्य का सत्यापन शामिल है, लेकिन चूंकि OAuth 1 एक अनएन्क्रिप्टेड कनेक्शन पर चल सकता है, प्रत्येक सत्यापन तार पर रहस्य को पारित नहीं कर सकता है।

जैसा कि आपने नोट किया है, एचएमएसी के साथ। क्लाइंट अपने प्राधिकरण अनुरोध के लिए तर्कों पर हस्ताक्षर करने के लिए सर्वर के साथ साझा किए गए रहस्य का उपयोग करता है। सर्वर तर्कों को लेता है, उन्हें क्लाइंट की कुंजी के साथ साइन करता है, और यह देखने में सक्षम है कि क्या यह एक वैध क्लाइंट है (चरण 1 में)।

इस हस्ताक्षर के लिए क्लाइंट और सर्वर दोनों को तर्कों के आदेश पर सहमत होने की आवश्यकता होती है (इसलिए वे समान स्ट्रिंग पर हस्ताक्षर कर रहे हैं), और OAuth 1 के बारे में मुख्य शिकायतों में से एक यह है कि इसके लिए सर्वर और क्लाइंट दोनों को सॉर्ट करना होगा और सांकेतिक रूप से हस्ताक्षर करें। यह पूरी तरह से कोड है और या तो यह सही है या आपको 401 Unauthorizedथोड़ी मदद मिलती है। इससे क्लाइंट लिखने की बाधा बढ़ जाती है।

SSL पर चलने के लिए प्राधिकरण अनुरोध की आवश्यकता के अनुसार, OAuth 2.0 तर्क छांटने और हस्ताक्षर करने की आवश्यकता को पूरी तरह से हटा देता है। क्लाइंट अपना सीक्रेट सर्वर से पास करता है, जो इसे सीधे सत्यापित करता है।

सर्वर-> सामग्री प्रदाता कनेक्शन में समान आवश्यकताएं मौजूद हैं, और चूंकि वह एसएसएल है जो OAuth सेवाओं तक पहुंचने वाले सर्वर को लिखने के लिए एक अवरोध को हटाता है।

इससे ऊपर के चरण 1, 2 और 5 में चीजें आसान हो जाती हैं।

तो इस बिंदु पर हमारे सर्वर में एक स्थायी पहुंच टोकन है जो उपयोगकर्ता के लिए एक उपयोगकर्ता नाम / पासवर्ड के बराबर है। यह अनुरोध के भाग के रूप में उस टोकन को पास करके उपयोगकर्ता की ओर से सामग्री प्रदाता को अनुरोध कर सकता है (क्वेरी तर्क, HTTP शीर्ष लेख या POST प्रपत्र डेटा के रूप में)।

यदि सामग्री सेवा केवल एसएसएल पर ही एक्सेस की जाती है, तो हम कर रहे हैं। यदि यह सादे HTTP के माध्यम से उपलब्ध है, तो हम उस स्थायी पहुँच टोकन को किसी तरह से सुरक्षित रखना चाहेंगे। कनेक्शन को सूँघने वाला कोई भी व्यक्ति उपयोगकर्ता की सामग्री तक हमेशा पहुँच बना सकेगा।

जिस तरह से OAuth 2 में हल किया गया है वह एक ताज़ा टोकन के साथ है । ताज़ा टोकन स्थायी पासवर्ड के बराबर हो जाता है, और यह केवल SSL पर प्रसारित होता है । जब सर्वर को सामग्री सेवा तक पहुंच की आवश्यकता होती है, तो यह अल्पकालिक एक्सेस टोकन के लिए ताज़ा टोकन का आदान-प्रदान करता है। इस तरह से सभी सूंघने योग्य HTTP एक्सेस टोकन के साथ बनाए जाते हैं जो समाप्त हो जाएंगे। Google अपने OAuth 2 API पर 5 मिनट की समाप्ति का उपयोग कर रहा है।

इसलिए ताज़ा टोकन से अलग, OAuth 2 क्लाइंट, सर्वर और सामग्री प्रदाता के बीच सभी संचारों को सरल करता है। और ताज़ा टोकन केवल तब सुरक्षा प्रदान करने के लिए मौजूद होते हैं जब सामग्री को अनएन्क्रिप्टेड एक्सेस किया जा रहा हो।

दो पैरों वाला प्रमाणीकरण

कभी-कभी, हालांकि, एक सर्वर को केवल अपनी सामग्री तक पहुंच को नियंत्रित करने की आवश्यकता होती है। दो-पैर वाला प्रमाणीकरण क्लाइंट को सर्वर से सीधे उपयोगकर्ता को प्रमाणित करने की अनुमति देता है।

OAuth 2 OAuth 1 के लिए कुछ एक्सटेंशन का मानकीकरण करता है जो व्यापक उपयोग में थे। मुझे जो सबसे अच्छी तरह से पता है वह ट्विटर द्वारा xAuth के रूप में पेश किया गया था । आप इसे OAuth 2 में रिसोर्स ओनर पासवर्ड क्रेडेंशियल्स के रूप में देख सकते हैं ।

अनिवार्य रूप से, यदि आप उपयोगकर्ता के क्रेडेंशियल्स (उपयोगकर्ता नाम और पासवर्ड) के साथ क्लाइंट पर भरोसा कर सकते हैं, तो वे एक्सेस टोकन के लिए सामग्री प्रदाता के साथ सीधे आदान-प्रदान कर सकते हैं। यह OAuth को मोबाइल एप्लिकेशन पर अधिक उपयोगी बनाता है - तीन-पैर वाले प्रमाणीकरण के साथ, आपको सामग्री सर्वर के साथ प्राधिकरण प्रक्रिया को संभालने के लिए एक HTTP दृश्य एम्बेड करना होगा।

OAuth 1 के साथ, यह आधिकारिक मानक का हिस्सा नहीं था, और अन्य सभी अनुरोधों के समान हस्ताक्षर प्रक्रिया की आवश्यकता थी।

मैंने रिसोर्स ओनर पासवर्ड क्रेडेंशियल्स के साथ OAuth 2 का सर्वर साइड लागू किया है, और क्लाइंट के नजरिए से, एक्सेस टोकन प्राप्त करना सरल हो गया है: सर्वर से एक्सेस का अनुरोध करें, क्लाइंट आईडी / सीक्रेट को HTTP ऑथराइजेशन हैडर और गुप्त रूप से पास करें प्रपत्र डेटा के रूप में उपयोगकर्ता का लॉगिन / पासवर्ड।

फायदा: सादगी

इसलिए एक कार्यान्वयनकर्ता के दृष्टिकोण से, मैं OAuth 2 में जो मुख्य लाभ देख रहा हूं, वे कम जटिलता में हैं। इसके लिए अनुरोध पर हस्ताक्षर करने की प्रक्रिया की आवश्यकता नहीं है, जो कि बिल्कुल कठिन नहीं है, लेकिन निश्चित रूप से निस्संदेह है। यह किसी सेवा के ग्राहक के रूप में कार्य करने के लिए आवश्यक कार्य को बहुत कम कर देता है, जो कि (आधुनिक, मोबाइल दुनिया में) आप सबसे अधिक दर्द को कम करना चाहते हैं। सर्वर-> कंटेंट प्रोवाइडर एंड पर कम जटिलता इसे डेटासेंटर में अधिक मापनीय बनाती है।

और यह मानक कुछ एक्सटेंशन को OAuth 1.0a (जैसे xAuth) में कोडित करता है जो अब व्यापक उपयोग में हैं।


20
शब्दावली के बारे में: यह बेहतर होगा, अगर आप अस्पष्ट लोगों (क्लाइंट, सर्वर, उपयोगकर्ता ..) का उपयोग करने के बजाय प्रभावित पक्षों (प्राधिकरण सर्वर, संसाधन सर्वर, संसाधन स्वामी) के आधिकारिक नामों से चिपके रहेंगे।
आयदिन के।

हाय पीटर आप प्राधिकरण सर्वर, संसाधन सर्वर, संसाधन स्वामी .. क्लाइंट, सर्वर, उपयोगकर्ता की ओर से अपनी पोस्ट बदल सकते हैं। जैसे Aydin K कहते हैं। यह ज्यादातर मुंह की शुरुआत के लिए मदद करता है। धन्यवाद।
जस्टकोड

@Aydin K आप प्राधिकरण सर्वर, संसाधन सर्वर, संसाधन स्वामी की ओर से क्लाइंट, सर्वर, उपयोगकर्ता की तुलना करने पर टिप्पणी कर सकते हैं। क्योंकि मैं भी एक नया हूं।
जस्टकोड

अगर किसी को ओउथ समझ में नहीं आता है। प्लेन इंग्लिश के बजाय oauth शब्दों का उपयोग करके ओउथ की व्याख्या करना उत्पादक नहीं लगता है।
जैकब

7

सबसे पहले, जैसा कि OAuth प्रमाणीकरण में स्पष्ट रूप से संकेत दिया गया है

OAuth 2.0 एक प्रमाणीकरण प्रोटोकॉल नहीं है।

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

हालाँकि, OAuth एप्लिकेशन को उस में से कोई नहीं बताता है। OAuth कहता है कि उपयोगकर्ता के बारे में कुछ भी नहीं है, और न ही यह कहता है कि उपयोगकर्ता ने अपनी उपस्थिति कैसे साबित की या यहां तक ​​कि अगर वे अभी भी वहां हैं। जहां तक ​​एक OAuth क्लाइंट का सवाल है, तो उसने टोकन मांगा, उसे टोकन मिला, और अंततः उस एपीआई का उपयोग करने के लिए उसका एपीआई इस्तेमाल किया। यह इस बारे में कुछ भी नहीं जानता कि आवेदन किसने अधिकृत किया था या यदि वहां कोई उपयोगकर्ता भी था।

OAuth का उपयोग करके उपयोगकर्ता प्रमाणीकरण के लिए एक मानक है: OpenID कनेक्ट, OAuth2 के साथ संगत।

OpenID कनेक्ट आईडी टोकन एक हस्ताक्षरित JSON वेब टोकन (JWT) है जो क्लाइंट एप्लिकेशन को नियमित OAuth एक्सेस टोकन के साथ दिया जाता है। आईडी टोकन में प्रमाणीकरण सत्र के बारे में दावे का एक सेट होता है, जिसमें उपयोगकर्ता (उप) के लिए एक पहचानकर्ता, पहचान प्रदाता (टोकन) जारी करने वाले पहचानकर्ता के लिए पहचानकर्ता, और ग्राहक का पहचानकर्ता जिसके लिए यह टोकन बनाया गया था () aud)।

गो में, आप कोरगोस / डेक्स, एक ओपनआईडी कनेक्ट आइडेंटिटी (ओआईडीसी) और ओउथ 2.0 प्रदाता को प्लगएबल कनेक्टर के साथ देख सकते हैं।

इस पोस्ट से उत्तर vonc


इसलिए, यदि आप एक ऐसे एप्लिकेशन का निर्माण कर रहे हैं, जहां आपके अलावा कोई अतिरिक्त क्लाइंट नहीं होगा, तो क्या OAuth को लागू करना भी उचित होगा? या OAuth से पूरी तरह परहेज करते हुए HTTP बेसिक ऑथेंटिकेशन को डायरेक्ट करना बेहतर होगा?
क्रिश्चियनएचजी

3

मैं इस प्रश्न का थोड़ा अलग तरीके से उत्तर दूंगा, और मैं बहुत सटीक और संक्षिप्त होगा, मुख्यतः क्योंकि @ पेटर टी ने यह सब उत्तर दिया।

इस मानक से जो मुख्य लाभ मुझे दिखता है वह है दो सिद्धांतों का सम्मान करना:

  1. चिंताओ का विभाजन।
  2. वेब एप्लिकेशन से प्रमाणीकरण को कम करना, जो आमतौर पर व्यवसाय का कार्य करता है।

ऐसा करने से,

  1. आप सिंगल साइनऑन के विकल्प को लागू कर सकते हैं: यदि आपके पास एक एसटीएस पर भरोसा करने वाले कई एप्लिकेशन हैं। मेरा मतलब है, सभी अनुप्रयोगों के लिए एक उपयोगकर्ता नाम।
  2. आप अपने वेब एप्लिकेशन (क्लाइंट) को उन संसाधनों तक पहुंचने में सक्षम कर सकते हैं जो उपयोगकर्ता के हैं और वेब एप्लिकेशन (क्लाइंट) के नहीं हैं।
  3. आप किसी तृतीय पक्ष को प्रमाणीकरण प्रक्रिया को अनिवार्य कर सकते हैं, जिस पर आप विश्वास करते हैं, और उपयोगकर्ता प्रमाणीकरण सत्यापन के बारे में कभी चिंता न करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.