26

के माध्यम से उपयोगकर्ता को सुरक्षित रूप से अधिकृत करने के लिए कैसे मैं उपयोगकर्ताओं को पेज को पुनः लोड किए बिना अपनी फेसबुक आईडी का उपयोग करके अपनी वेबसाइट पर लॉग इन करना चाहता हूं। यही कारण है कि मैं Facebook Javascript SDK का उपयोग करता हूं। यह योजना इस एसडीके के साथ प्राधिकरण प्रवाह का वर्णन करती है: enter image description hereफेसबुक के जावास्क्रिप्ट एसडीके

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

हालांकि, यह बहुत असुरक्षित लगता है। मेरी सर्वर-साइड स्क्रिप्ट को उपयोगकर्ता की आईडी पता करने के लिए, मुझे इसे AJAX के माध्यम से भेजना होगा। हालांकि, मेरे पास यह जानने का कोई तरीका नहीं है कि यह आईडी का स्वामी है जो लॉग इन करने का प्रयास कर रहा है। कोई भी आईडी के साथ POST अनुरोध भेज सकता है (विशेष रूप से किसी के पास किसी अन्य उपयोगकर्ता की आईडी हो जाती है)।

मेरे वर्तमान विचार उपयोगकर्ता सामान्य रूप से जे एस SDK के माध्यम से में प्रवेश करें, सर्वर से AJAX के माध्यम से आईडी और पहुंच टोकन भेजने और फिर PHP स्क्रिप्ट में cURL का उपयोग सुनिश्चित करने के लिए उपयोगकर्ता वास्तव में लॉग ऑन है यह बताने के लिए है।

क्या यह जाने का तरीका है, या क्या मैं बेहतर विकल्प देख रहा हूं?

+1

आप जावास्क्रिप्ट-एसडीके को php-sdk के साथ क्यों नहीं जोड़ते हैं क्योंकि ऐसा लगता है कि आप PHP पक्ष का उपयोग सर्वर साइड भाषा के रूप में कर रहे हैं वैसे भी – TommyBs

उत्तर

24
  1. आप ajax के माध्यम से उपयोगकर्ता की आईडी पुश करने के लिए की जरूरत नहीं है:

    इस संबंधित सवाल देख सकते हैं। आपको सर्वर की तरफ, fbsr_ {app_id} कुकी का उपयोग करना चाहिए जिसमें sign_request है। 'User_id' प्राप्त करने के लिए एफबी द्वारा जारी किए गए अपने 'गुप्त' app_secret का उपयोग करके इस हस्ताक्षर_रेक्वेस्ट को पार्स करें। नोट: एक सफल पार्स यह भी दिखाता है कि एफबी द्वारा प्रदान किया गया कुकी डेटा छेड़छाड़ नहीं किया गया है।

  2. एक बार जब आप हस्ताक्षरित_रेक्वेस्ट का विश्लेषण करते हैं, तो आपको 'iss_at' समय भी मिलना चाहिए। जांचें कि यह समय पिछले 10 मिनट के भीतर है। ऐसा करके, आप जानते हैं कि लॉगिन अनुरोध उपयोगकर्ता के रूप में उपयोगकर्ता (उपयोगकर्ता_आईडी के साथ) क्लाइंट-साइड एसडीके का इस्तेमाल करता है। (संदर्भ: http://developers.facebook.com/roadmap/completed-changes/)

  3. आपको तुरंत इस कोड को access_token के लिए एक्सचेंज करना चाहिए। यदि यह विफल हो जाता है (एफबी आपको OAuthException प्रकार का त्रुटि संदेश देगा), इसका मतलब है कि फेसबुक पर उपयोगकर्ता साइन इन करने के बीच एक अप्राकृतिक देरी हुई थी और आपको लॉगिन अनुरोध प्राप्त हुआ था।

चरण # 2 के साथ, आप पुरानी fbsr_ कुकी का उपयोग करके हमले के प्रयासों को विफल कर सकते हैं। यदि उपयोगकर्ता (user_id से) के पास पहले से आपके साथ खाता है, तो आप यहां रुकना और उपयोगकर्ता को लॉगिन करना चाहेंगे। हालांकि, ऐसे परिदृश्य हो सकते हैं जहां आपके app_secret से समझौता किया जा सकता है।इस मामले का ख्याल रखने के लिए, आपको चरण # 3 का पालन करना चाहिए, क्योंकि access_token के लिए कोड का आदान-प्रदान केवल और के मुद्दे के 10 मिनट के भीतर हो सकता है। यदि उपयोगकर्ता के पास आपकी साइट के साथ कोई खाता नहीं है, तो फिर भी आपको एफबी से नाम, ईमेल इत्यादि जैसे अन्य आवश्यक उपयोगकर्ता डेटा को पुनर्प्राप्त करने के लिए access_token का उपयोग करने के लिए चरण # 3 की आवश्यकता है।

इसलिए, कोई और पीड़ित की कुकी चोरी करने और हमला करने की कोशिश कर रहा है केवल 10 मिनट सुरक्षा अंतर के भीतर ही संभव है। यदि आप इस सुरक्षा छेद से नाखुश हैं, तो आपको सर्वर-साइड प्रमाणीकरण में माइग्रेट करना चाहिए। निर्णय आपके द्वारा संग्रहीत उपयोगकर्ता जानकारी की संवेदनशीलता पर निर्भर करता है। और आप सर्वर-साइड ऑथ पर जाने वाली किसी भी चीज़ से समझौता नहीं करते हैं, आप साथ ही अन्य चीजों के लिए क्लाइंट-साइड विधियों का उपयोग करना जारी रख सकते हैं।

+0

@exizt मैंने आपकी समझ के लिए कुछ बिंदुओं को स्पष्ट करने का प्रयास किया। यदि यह आपकी क्वेरी हल करता है, तो आपको जवाब स्वीकार करना चाहिए। – Ethan

+0

मैं अपने सर्वर की ओर जावा का उपयोग कर रहा हूं। ग्राफ एपीआई के लिए क्या कॉल मैं पहले चरण के लिए किया जाएगा? –

+1

कुकी को पार्स करके आपका क्या मतलब है? node.js या ASP.net का उपयोग करके इसे कैसे करें? –

8

एक बार जब आप जेएस एसडीके के माध्यम से किसी उपयोगकर्ता में लॉग इन कर लेते हैं, तो एक विशेष कुकी स्थापित की जाएगी जिसमें क्रेडेंशियल जानकारी होगी (यदि मैं सही हूं तो आपकी गुप्त कुंजी के साथ एन्कोड किया गया है)। इस जानकारी का उपयोग PHP SDK getUser() method के माध्यम से किया जा सकता है।

जब तक आपका एपीआई (आपका AJAX एंडपॉइंट) आपके ऐप के समान डोमेन पर है, तो जब भी उपयोगकर्ता आपके सर्वर से अनुरोध करता है तो आपको यह कुकी प्राप्त करनी चाहिए।

बेशक, आपको यह सुनिश्चित करना होगा कि जावास्क्रिप्ट एसडीके सही ढंग से सेटअप हो और आपने cookie: true config option का उपयोग किया है, और आप valid channel file देते हैं। यदि इन आवश्यकताओं को पूरा नहीं किया गया है, तो आपको आईई और सफारी में क्रॉस-डोमेन संचार और तृतीय पक्ष कुकी के साथ कुछ परेशानी हो सकती है। A proper approach to FB auth

संबंधित मुद्दे