वेबसाइट के लिए REST API जो प्रमाणीकरण के लिए फेसबुक का उपयोग करता है


86

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

अब हम अपनी साइट के लिए एक iPhone एप्लिकेशन बनाना चाहते हैं और दूसरों के लिए भी हमारी सेवा का उपयोग करने के लिए एक सार्वजनिक एपीआई।

यह सवाल है कि ऐप / एपीआई से हमारी वेबसाइट को कैसे प्रमाणित किया जाए और इसे 2 भागों में तोड़ा जाए:

  1. एक वेबसाइट से एपीआई के लिए REST प्रमाणीकरण को संभालने का सही तरीका क्या है जो केवल प्रमाणीकरण विधि के रूप में Facebook OAuth का उपयोग करता है?

मैंने REST API के लिए प्रमाणीकरण के मानक तरीकों के बारे में बहुत कुछ पढ़ा और शोध किया है। हम HTTPS पर बेसिक ऑथ के रूप में इस तरह के तरीकों का उपयोग नहीं कर सकते हैं , क्योंकि उपयोगकर्ता के लिए ऐसे कोई क्रेडेंशियल नहीं हैं। की तरह कुछ इस ही एपीआई का उपयोग कर आवेदन पत्र के सत्यापन के लिए हो रहा है।

वर्तमान में, सबसे अच्छा तरीका मुझे लगता है कि आप हमारे एपीआई पर एक / अधिकृत अंत-बिंदु को हिट कर सकते हैं, यह फेसबुक OAuth पर पुनर्निर्देशित करता है, फिर साइट पर वापस रीडायरेक्ट करता है और एक 'टोकन' प्रदान करता है जिसे एपीआई का उपयोगकर्ता बाद में प्रमाणित करने के लिए उपयोग कर सकता है। अनुरोध।

  1. हमारे द्वारा बनाए जाने वाले आधिकारिक एप्लिकेशन के लिए, हमें जरूरी नहीं कि उसी तरह से सार्वजनिक एपीआई का उपयोग किया जाए। फिर हमारी वेबसाइट से बात करने और उपयोगकर्ताओं को प्रमाणित करने का सबसे अच्छा तरीका क्या होगा?

मैं समझता हूं (मुझे लगता है) कि हमारे एपीआई का उपयोग करने वाले 3-पार्टी एप्लिकेशन, एपीआई (सार्वजनिक) कुंजी और गुप्त (निजी) कुंजियों का उपयोग कैसे प्रमाणित करें। हालांकि, जब ऐप का उपयोग करने वाले उपयोगकर्ता को प्रमाणित करने की बात आती है, तो मैं इस बारे में भ्रमित हो रहा हूं कि इसके बारे में कैसे जाना जाए जब एक उपयोगकर्ता को प्रमाणित करने का एकमात्र तरीका फेसबुक है।

मुझे लगता है कि मैं कुछ बहुत स्पष्ट याद कर रहा हूं, या यह पूरी तरह से समझ में नहीं आता कि सार्वजनिक रीस्ट एपीआई को कैसे काम करना चाहिए, इसलिए किसी भी सलाह और मदद की बहुत सराहना की जाएगी।


मैं stackoverflow.com/questions/30230482/… पर कुछ ऐसा ही सवाल करता हूँ, जो इनमें से कुछ के बारे में बात करता है
JVK

जवाबों:


99

अद्यतन: नीचे देखें

मैं इस प्रश्न के बारे में भी सोच रहा हूँ। यह मेरे लिए अभी तक पूरी तरह से स्पष्ट नहीं है, लेकिन यहां मैं जिस रास्ते पर जाने की सोच रहा हूं। मैं एक REST API बना रहा हूं, मेरे उपयोगकर्ता केवल फेसबुक कनेक्ट के साथ ही मुखर हैं।

ग्राहक पर:

  1. लॉगिन करने और OAUTH2 कोड प्राप्त करने के लिए Facebook API का उपयोग करें।
  2. एक्सेस टोकन के लिए इस कोड को एक्सचेंज करें।
  3. अपने कस्टम एपीआई में हर कॉल में मैं फेसबुक यूजर आईडी और एक्सेस टोकन शामिल करूंगा।

एपीआई (उपयोगकर्ता प्रमाणीकरण के लिए आवश्यक प्रत्येक विधि के लिए):

  1. ऊपर से पहुँच टोकन का उपयोग करके / me Facebook ग्राफ के लिए एक अनुरोध करें।
  2. सत्यापित करें कि फेसबुक उपयोगकर्ता आईडी वापस से ऊपर से मेरे एपीआई में पारित उपयोगकर्ता आईडी से मेल खाती है।
  3. यदि पहुंच टोकन की समय सीमा समाप्त हो गई है तो अतिरिक्त संचार की आवश्यकता है।

मुझे अभी इसका परीक्षण करना बाकी है। यह कैसा लग रहा है?

--- अद्यतन: 27 जुलाई, 2014 सवाल का जवाब देने के लिए ---

मैं केवल लॉगिन करने के बाद उपरोक्त विनिमय का उपयोग करता हूं। एक बार जब मैं निर्धारित करता हूं कि कौन सा उपयोगकर्ता लॉग इन कर रहा है, तो मैं अपना एक्सेस टोकन बनाता हूं, और उस टोकन का उपयोग उस बिंदु से आगे बढ़ने के लिए किया जाता है। तो नया प्रवाह ऐसा दिखता है ...

ग्राहक पर:

  1. लॉगिन करने और OAUTH2 कोड प्राप्त करने के लिए Facebook API का उपयोग करें।
  2. एक्सेस टोकन के लिए इस कोड को एक्सचेंज करें।
  3. मेरे API से एक्सेस टोकन का अनुरोध करें, जिसमें फेसबुक टोकन एक पैरामीटर के रूप में शामिल है

एपीआई पर

  1. पहुँच टोकन अनुरोध प्राप्त करें।
  2. फेसबुक एक्सेस टोकन का उपयोग करके / me फेसबुक ग्राफ के लिए एक अनुरोध करें
  3. सत्यापित करें कि Facebook उपयोगकर्ता मौजूद है और मेरे डेटाबेस के उपयोगकर्ता से मेल खाता है
  4. अपनी खुद की एक्सेस टोकन बनाएं, इसे सहेजें और इसे इस बिंदु से आगे उपयोग करने के लिए क्लाइंट को वापस करें

अरे, यह एक तरह से देर से उत्तर है, लेकिन आपका समाधान मेरे पहले उत्तर में मेरे पास मौजूद समस्या को ठीक करने के लिए लगता है। बेशक आपको स्पष्ट पाठ में तार पर (आईडी, टोकन) जोड़ी नहीं भेजने के लिए HTTPS का उपयोग करना होगा। लेकिन ऐसा लग रहा है कि यह काम करना चाहिए!
ओलिवियर लांस

मुझे लगता है कि सर्वर पर मुझे कॉल करना / कॉल करना अच्छा है और अपना एक्सेस टोकन जेनरेट करें, जो मोबाइल क्लाइंट द्वारा उपयोग किया जाएगा।
डेर_मिस्टर

मैंने पाया कि मोबाइल ऐप में एफबी सीक्रेट स्टोर करना बुरा है। फेसबुक इसे केवल अपने सर्वर पर स्टोर करने की सलाह देता है। Developers.facebook.com/docs/opengraph/use-actions/…
Der_Meister

अगर हम हर बार API सर्वर पर user_id और access_token भेजते हैं (जैसा कि पोस्ट / पारस मिलता है)। यदि कोई एक कनेक्शन को बाधित करने में सक्षम है तो क्या यह सुरक्षा छेद बनाएगा?
नाथन दो

@NathanDo अपने क्लाइंट और API सर्वर के बीच HTTPS का उपयोग करें और यदि कोई व्यक्ति कनेक्शन को स्वीकार करता है तो यह एक मुद्दा नहीं होना चाहिए (हार्दिक-प्रकार की कमजोरियाँ एक तरफ)।
डीसीआर

15

यह JWTs (JSON वेब टोकन) का उपयोग करके मेरा कार्यान्वयन है, जो मूल रूप से क्रिस के अद्यतन उत्तर के समान है। मैंने फेसबुक JS SDK और JWT का उपयोग किया है।

यहाँ मेरा कार्यान्वयन है।

  1. क्लाइंट: लॉग इन करने और एक्सेस टोकन प्राप्त करने के लिए Facebook JS SDK का उपयोग करें।

  2. क्लाइंट:/verify-access-token एंडपॉइंट कॉल करके मेरे एपीआई से JWT का अनुरोध करें ।

  3. MyAPI: एक्सेस टोकन प्राप्त करता है, /meफेसबुक एपीआई के समापन बिंदु को कॉल करके इसे सत्यापित करें।

  4. MyAPI: यदि पहुँच टोकन मान्य है, तो उपयोगकर्ता को डेटाबेस से पाता है, मौजूद उपयोगकर्ता में लॉग करता है। पेलोड के रूप में आवश्यक फ़ील्ड के साथ एक जेडब्ल्यूटी बनाएं, एक एक्सपायरी सेट करें, गुप्त कुंजी के साथ हस्ताक्षर करें और क्लाइंट को वापस भेजें।

  5. ग्राहक: स्थानीय भंडारण में JWT को संग्रहीत करता है।

  6. क्लाइंट: अगले एपीआई कॉल के अनुरोध के साथ टोकन (चरण 5 से जेडब्ल्यूटी) भेजता है।

  7. MyAPI: गुप्त कुंजी के साथ टोकन को मान्य करें, अगर टोकन वैध है, तो टोकन को एक नए के लिए एक्सचेंज करें, इसे एपीआई प्रतिक्रिया के साथ क्लाइंट को वापस भेजें। (कोई बाहरी एपीआई टोकन के सत्यापन के लिए यहां कॉल नहीं करता है) [यदि टोकन अमान्य / समाप्त हो चुका है तो ग्राहक को फिर से प्रमाणित करने और 1 के लिए दोहराने का अनुरोध करता है]]

  8. ग्राहक संग्रहीत टोकन को नए के साथ बदल देता है और इसे अगले API कॉल के लिए उपयोग करता है। एक बार टोकन एक्सपायरी मिलने के बाद, टोकन एपीआई तक पहुंच को समाप्त कर देता है।

हर टोकन का एक बार उपयोग किया जाता है।

सुरक्षा और JWT के बारे में अधिक जवाब पढ़ें

JWT कितना सुरक्षित है

यदि आप JWT को डीकोड कर सकते हैं तो वे कैसे सुरक्षित हैं?

उपयोगकर्ता पहचान और प्रमाणीकरण टोकन के रूप में JSON वेब कैम (JWT)


3
मुझे लगता है कि # 3 बल्कि होना चाहिए /debug_token, ताकि आप जांच सकें कि टोकन वास्तव में आपके आवेदन के लिए है।
पेप्पे एलजी

2
access_tokenक्लाइंट में अनुरोध न करें । "कोड वर्कफ़्लो" का उपयोग करें। codeMyAPI पास करें और फेसबुक के codeसाथ आदान-प्रदान करने के लिए एक और गोल यात्रा करें access_token। इसे यहाँ और अधिक अच्छी तरह समझाया गया है: Developers.facebook.com/docs/facebook-login/security
omikron

5

मैं उसी सवाल का जवाब देने की कोशिश कर रहा हूं और हाल ही में बहुत कुछ पढ़ रहा हूं ...

मेरे पास "जवाब" नहीं होगा लेकिन चीजें मेरे लिए थोड़ी स्पष्ट हो रही हैं। क्या आपने लेख में वर्णित टिप्पणियों को पढ़ा है ? मैंने उन्हें वास्तव में दिलचस्प और मददगार पाया।

नतीजतन, और पहले लेख के बाद से चीजें कैसे विकसित हुई हैं, इसके प्रकाश में, यहाँ मैं क्या सोचता हूँ:

  • हर जगह HTTPS - यह आपको HMAC, साइनिंग, नॉन, ...

  • OAuth2 का उपयोग करें:

    • जब प्रमाणीकरण अनुरोध मेरे स्वयं के ऐप्स / वेबसाइट से आते हैं, तो पहले बताए गए लेख के उत्तर में वर्णित इस 'ट्रिक' (या इसका एक रूपांतर) का उपयोग करें ।

    • मेरे मामले में, मेरे पास दो प्रकार के उपयोगकर्ता हैं: वे जो क्लासिक लॉगिन / पासवर्ड क्रेडेंशियल वाले हैं और जिन्होंने फेसबुक कनेक्ट के साथ साइन अप किया है।
      तो मैं "फेसबुक के साथ लॉगिन" बटन के साथ एक नियमित लॉगिन फ़ॉर्म प्रदान करूंगा। यदि उपयोगकर्ता अपने "क्लासिक" क्रेडेंशियल्स के साथ लॉग इन करता है, तो मैं इन्हें केवल अपने OAuth2 समापन बिंदु के साथ भेजूंगा grant_type=password
      अगर वह फेसबुक के माध्यम से लॉग इन करना चुनता है, तो मुझे लगता है कि यह दो चरणों वाली प्रक्रिया होगी:

      • सबसे पहले, FBSession को खोलने के लिए Facebook iOS SDK का उपयोग करें
      • जब ऐसा किया जाता है और एप्लिकेशन को वापस नियंत्रण दिया जाता है, तो उस उपयोगकर्ता के लिए फेसबुक आईडी प्राप्त करने का एक तरीका होना चाहिए। मैं अपने OAuth2 समापन बिंदु पर इस आईडी को केवल मेरे सर्वर द्वारा "FB उपयोगकर्ता आईडी का उपयोग कर" के रूप में समझा गया एक्सटेंशन अनुदान के साथ भेजूंगा ।

कृपया ध्यान दें कि मैं अभी भी इस सभी सामानों पर भारी शोध कर रहा हूं, ताकि एक सही उत्तर न हो ... शायद एक भी सही नहीं है! लेकिन मुझे लगता है कि यह एक अच्छी शुरुआत है। फेसबुक प्रमाणीकरण के लिए "एक्सटेंशन ग्रांट" का उपयोग करने का विचार हो सकता है कि इसमें चीजों को ठीक से करने के लिए इसे पंजीकृत करना शामिल है? मुझे पक्का यकीन नहीं है।

वैसे भी, मुझे आशा है कि मैं आपकी थोड़ी मदद करने में सक्षम था, और कम से कम यह इस समाधान का सबसे अच्छा समाधान खोजने के लिए चर्चा शुरू कर सकता है :)

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

इस तरह से करने के बारे में क्या:

  • "फेसबुक लॉगिन" बटन के साथ एक लॉगिन फ़ॉर्म दिखाएं
  • यदि यह लॉगिन तरीका चुना जाता है, तो फेसबुक एसडीके की तरह कार्य करें: अपने प्रमाणीकरण सर्वर से एक वेब पेज खोलें, जो फेसबुक लॉगिन को आरंभ करेगा।
  • उपयोगकर्ता द्वारा लॉग इन करने के बाद, फेसबुक पुष्टि करने के लिए आपके रीडायरेक्ट URL का उपयोग करेगा; उस URL को अपने प्रमाणीकरण सर्वर के किसी अन्य बिंदु पर इंगित करें (संभवतः एक अतिरिक्त पैरामीटर से संकेत मिलता है कि एक ऐप से कॉल आया था?)
  • जब प्रमाणीकरण समापन बिंदु मारा जाता है, तो प्रमाणीकरण उपयोगकर्ता को सुरक्षित रूप से पहचान सकता है, अपनी FB उपयोगकर्ता आईडी / FB सत्र को बनाए रख सकता है और कस्टम URL योजना का उपयोग करके अपने ऐप पर पहुंच टोकन वापस कर सकता है, ठीक उसी तरह जैसे फेसबुक एसडीके करेगा।

बेहतर लग रहा है?


1
आपके जवाब के लिए धन्यवाद! मैंने आपके बारे में जो कुछ कहा था, उसके बारे में मैंने सोचा था, लेकिन मुख्य चिंता मुझे एफबी आईओएस एसडीके का उपयोग करने और फिर फेसबुक यूजर आईडी भेजने में थी, जो आप अपने एपीआई एंडपॉइंट के लिए किसी भी आईडी को भेजना आसान नहीं होगा और होने का दावा करेंगे एक और उपयोगकर्ता? यह वह जगह है जहाँ मैं आमतौर पर अटक जाता हूँ ..
एडम

वास्तव में! मेरे बारे में यह सोचना कोई बेवकूफी नहीं थी ... इसलिए समाधान को किसी तरह अपने स्वयं के प्रमाणीकरण सर्वर से गुजरना पड़ता है ...
ओलिवियर लांस

मैंने अपने उत्तर को एक अन्य समाधान विचार के साथ अपडेट किया है ... लेकिन बस एहसास हुआ कि आपने अपने मूल प्रश्न में इसका उल्लेख किया था! मैं इस समय कुछ और नहीं देख सकता ...
ओलिवियर लांस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.