एक iOS ऐप में फेसबुक प्रमाणीकरण के लिए डिज़ाइन जो एक सुरक्षित वेब सेवा तक भी पहुंच बनाता है


402

लक्ष्य: एक उपयोगकर्ता को फेसबुक के साथ एक iOS एप्लिकेशन में प्रमाणीकरण करने की अनुमति दें, जिसे संरक्षित वेब सेवा तक पहुंच की आवश्यकता होती है जो मैं चला रहा हूं।

मान्यताओं: उन उपयोगकर्ताओं के लिए एक देशी प्रमाणीकरण (और पंजीकरण) प्रणाली है जो साइन इन के लिए फेसबुक का उपयोग नहीं करने का विकल्प चुनते हैं।

विवरण:

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

मुझे आश्चर्य है कि फेसबुक के पास इसके डेवलपर प्रलेखन में सर्वोत्तम अभ्यास नहीं हैं। सभी मौजूदा दस्तावेज़ या तो यह मान रहे हैं कि आप किसी वेबसाइट में FB को बना रहे हैं, या एक स्टैंडअलोन मोबाइल ऐप है जिसमें बिना किसी सेवा के प्रमाणीकरण की आवश्यकता होती है।

यहां मेरे प्रारंभिक विचार हैं कि यह कैसे डिज़ाइन किया जाएगा लेकिन क्या यह सही है, इस पर सत्यापन चाहते हैं।

  1. क्लाइंट फेसबुक आईओएस लॉगिन को पॉप करता है
  2. यूआई उपयोगकर्ता फेसबुक क्रेडेंशियल्स के साथ साइन इन करता है और एक्सेस टोकन प्राप्त करता है
  3. आईओएस ऐप हमारे सर्वर तक पहुंच टोकन पास करता है
  4. हमारा सर्वर FB ग्राफ़ एपीआई से टोकन की पहुँच का उपयोग करके (a) टोकन को मान्य करता है और (b) उस एक्सेस टोकन के लिए FB उपयोगकर्ता आईडी प्राप्त करता है।

    उदा। हमारा सर्वर https://graph.facebook.com/me/?access_token=XYZ पर कॉल करेगा जो एक JSON ऑब्जेक्ट में प्रोफ़ाइल जानकारी लौटाएगा

  5. यह मान्य है, हमारा सर्वर JSON ऑब्जेक्ट से उपयोगकर्ता आईडी निकालता है और जांचता है कि उपयोगकर्ता के पास पहले से ही खाता है या नहीं। यदि हां, तो हम उस सत्र के लिए उपयोग करने के लिए क्लाइंट को अपना स्वयं का टिकट जारी करते हैं। यदि उपयोगकर्ता के पास कोई खाता नहीं है, तो हम फेसबुक यूजर आईडी के साथ एक नया बनाते हैं, अपना खुद का यूनीक यूजरआईडी असाइन करते हैं और अपना ओटोमेटिक टिकट जारी करते हैं।

  6. इसके बाद क्लाइंट को बाद के इंटरैक्शन पर ऑर्टिकल टिकट वापस करना पड़ता है, जिसे प्रमाणीकरण की आवश्यकता होती है।

यह मेरे लिए सही दृष्टिकोण की तरह लगता है लेकिन निश्चित नहीं है कि अगर मैं कुछ बुनियादी रूप से याद कर रहा हूं और गलत (जटिल) रास्ते पर जा रहा हूं।


1
यह कैसे हल किया गया था? मैं एक्सेस टोकन को पास करने के साथ-साथ सर्वर पर उपयोगकर्ता को स्पिन करने के लिए देख रहा हूं। अकादमिक लगता है, लेकिन मैं पूछ रहा हूं।
क्रिस वैन बुस्किर्क

रेल और डेविस का उपयोग करके यह मेरा कार्यान्वयन था: stackoverflow.com/questions/7232490/…
मैट

FB API (iOS डिवाइस से एक और सर्वर से एक बार) में दो कॉल करने के बजाय पूरे ओडिसी_हाश को पास क्यों नहीं करें?
bsiddiqui

1
क्या होगा यदि आप एक अलग डिवाइस से लॉग इन करना चाहते हैं (मतलब आपके पास अपना टिकट नहीं है)? और अगर आपको नया नया टिकट मिलता है, तो रास्ते में किसी को फेसबुक आईडी / टोकन अपहृत करने से कौन रोकता है और इसे अपने डिवाइस पर उपयोग करें?
अमिताफल

जिज्ञासा से बाहर, चरण 5 में, अपना खुद का टिकट क्यों जारी करें? क्या आप प्रत्येक बाद के सर्वर कॉल के लिए फेसबुक एक्सेस टोकन का उपयोग नहीं कर सकते थे? मुझे लगता है कि इसके लिए सर्वर से लेकर फेसबुक एपीआई तक हर ऐप के लिए कॉल करना होगा -> सर्वर कॉल केवल पहले वाले के बजाय।
एंडर्स

जवाबों:


80

मैंने अभी अपने आप से निपटा है, और यहाँ वह हिस्सा है जो मुझे थोड़ा परेशान करता है:

आपके चरण 5 में ... उपयोगकर्ता के लिए आपके फेसबुक आईडी से पूरी तरह से अलग खाते के लिए पंजीकरण करना संभव है, है ना? फिर कुछ और समय वे फेसबुक के साथ लॉग इन करते हैं .... और आपने उन्हें एक दूसरा खाता बनाया और अपना पहला खाता खो दिया।

आपकी वेब सेवा में लॉग इन होने का एक तरीका होना चाहिए, फिर फेसबुक में लॉग इन करें, और फेसबुक आईडी और स्थानीय खाते के बीच सहयोग पर कब्जा करें।

इसके अलावा, आपकी योजना ठोस लगती है।

अपडेट : फेसबुक ने यहां इस तरह के परिदृश्य को रेखांकित करते हुए एक डॉक्टर जोड़ा है


7
हां, मैंने माना है कि और आप हाजिर हैं। यदि हमारा समान ईमेल पता है, तो हम मर्जिंग खातों पर योजना बनाते हैं, और यदि नहीं, तो हम उन्हें मर्ज करने का एक और तरीका बनाएंगे।
टीएमसी

आप अनुरोध करने के लिए किस सर्वर लाइब्रेरी का उपयोग सर्वर साइड पर कर रहे हैं?
टिमलेंग

7
@TimLeung - मेरी समझ यह है कि एक एक्सेस टोकन ऐप आईडी को एम्बेड करता है, और इसमें ऐप आईडी के बिना आपके पास एक्सेस टोकन नहीं हो सकता है।
डैन रे

1
@TimLeunge: हम उपयोगकर्ता की पहुंच टोकन के साथ अनुरोध के लिए ग्राफ़ एपीआई का उपयोग कर रहे हैं।
TMC 7

29

फेसबुक द्वारा बताए गए अपने सर्वर पर स्थित ऑउटलेट टोकन को ट्रांसमिट करने के लिए https का उपयोग करें

एक्सेस टोकन साझा करना

हमारी डेटा नीतियां स्पष्ट रूप से किसी भी अन्य ऐप के साथ आपके ऐप के लिए एक्सेस टोकन के किसी भी साझाकरण को प्रतिबंधित करती हैं। हालाँकि, हम डेवलपर्स को मूल कार्यान्वयन और उसी ऐप के सर्वर कार्यान्वयन के बीच टोकन साझा करने की अनुमति देते हैं (यानी एक ही ऐप आईडी का उपयोग करते हुए) जब तक स्थानांतरण HTTPS का उपयोग करके स्थानांतरित नहीं हो जाता है।


16

एक समस्या जो मैं इस रणनीति के साथ देख सकता हूं, वह यह है कि कोई व्यक्ति आपको एक अलग फेसबुक ऐप के लिए प्राप्त टोकन दे सकता है। जहाँ तक मुझे पता है, यह सत्यापित करने का कोई तरीका नहीं है कि एक्सेस टोकन आपके एप्लिकेशन के लिए है, इसलिए आप बस इसे इस्तेमाल करेंगे।

यह बहुत हानिकारक नहीं है, हालांकि। आम तौर पर लोग / ऐप्स एक्सेस टोकन को साझा करने के बजाय सुरक्षित रखने की कोशिश करते हैं।

इसका एक संभावित फायदा यह होगा कि कोई व्यक्ति अपनी साइट या मोबाइल ऐप बनाने के लिए, अपने उपयोगकर्ताओं के लिए एक्सेस टोकन प्राप्त करें और अपने एपीआई का उपयोग करके उन्हें प्रमाणित करने का प्रयास करें। यदि यह सफल होता है (उपयोगकर्ता का आपकी साइट में एक फ़ेसबुक खाता है), तो दुर्भावनापूर्ण साइट आपके एपीआई का उपयोग उपयोगकर्ता को करने में सक्षम होगी।

यह एक लंबा शॉट है, लेकिन मुझे लगता है कि यह काम कर सकता है।

संपादित करें: ऐसा लगता है कि सभी के बाद पहुंच टोकन को मान्य करने का एक तरीका है। प्रश्न पर @ डैनियल द्वारा उत्तर देखें यूजर एक्सेस टोकन से एप्लिकेशन आईडी प्राप्त करें (या टोकन के लिए स्रोत एप्लिकेशन को सत्यापित करें)


इसे भेजना appsecret_proofचाहिए ( यहाँ देखें )
टोनी

@ क्या आप बता सकते हैं कि appsecret_proofयहाँ कैसे मदद मिलती है? जहां तक ​​मैं समझता हूं, यह फेसबुक को साबित करने के लिए कार्य करता है कि सर्वर को गुप्त कुंजी पता है। हालाँकि, ivant एक दुर्भावनापूर्ण ऐप का उल्लेख कर रहा था जो टोकन प्राप्त कर रहा था और फिर उन्हें आपके एपीआई में भेज रहा था। सर्वर ऐप आईडी को सत्यापित कर सकता है, लेकिन दुर्भावनापूर्ण ऐप द्वारा ऐप आईडी को आसानी से खराब किया जा सकता है। तो ... यह कैसे कम होगा?
YSK

3
आप यह सत्यापित कर सकते हैं कि आपके ऐप के लिए टोकन जनरेट किया गया था, https://graph.facebook.com/app/?access_token=[user_access_token]जिसके माध्यम से ऐप आईडी लौटाता है, और फिर ऐप आईडी की तुलना करता है
नादेर एलेक्सन

4

आपका समाधान पूरी तरह से काम करता है।

हो सकता है एक विकल्प: क्यों न केवल प्रारंभिक सामाजिक सेवा अनुरोध से ग्राहक को ईमेल प्राप्त करें और अपनी वेब सेवा को भेजें? वेब सेवा ईमेल को स्टोर कर सकती है, और शायद सोशल_प्रोवाइडर भी। मैं समझता हूं कि आपकी वेब सेवा वह ईमेल प्रमाणित नहीं कर पाएगी जहां से ईमेल आया था, लेकिन क्या आपकी वेब सेवा और आपके ग्राहक के बीच उच्च-भरोसेमंद संबंध नहीं है? अगर वहाँ है, तो लगता है जैसे आप सही जगह से आने वाले ईमेल पर निर्भर कर सकते हैं। कृपया किसी को बताएं कि मुझे कौन सी स्पष्ट बात याद आ रही है जो ईमेल-आधारित दृष्टिकोण को मूर्खतापूर्ण बनाती है ...


3
मुझे आसानी से पता चल गया कि क्लाइंट सर्वर से कैसे बात कर रहा है। तब तक मैं सिर्फ इस पर ईमेल फेंक सकता था जब तक कि मुझे एक हिट नहीं मिलती। हमेशा सत्यापन का कुछ रूप होना चाहिए
क्रिस

5
उच्च विश्वास और ग्राहक? कृपया एक ही वाक्य में कभी नहीं। पाठ्यक्रम के पिछले वाक्य को छोड़कर।
EralpB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.