5

तो मैं फेसबुक जे एस SDK के साथ ग्राफ़ एपीआई का उपयोग करने की कोशिश कर रहा हूँ और मैं सफारी में निम्न त्रुटि हो रही है:का उपयोग करते हुए फेसबुक ग्राफ एपीआई टूट गया है

"OAuthException: वर्तमान उपयोगकर्ता के बारे में जानकारी पूछने के लिए एक सक्रिय एक्सेस टोकन का उपयोग किया जाना चाहिए।"

मुझे संदेह था कि सफारी को एक्स-डोमेन कुकी सेटिंग के साथ बहुत सख्त है और इसलिए मैंने इसे cookie विकल्प के साथ फ़ायरफ़ॉक्स में FB.init() में गलत करने के लिए सेट किया। मुझे वास्तव में पता चला कि मुझे अपने FB.api() अनुरोधों के लिए एक ही त्रुटि मिल रही थी।

FB.init({ 
    appId: "<%= app_id %>", 
    status: true, // check login status 
    // We cannot rely on this cookie being set in an iframe. I found this 
    // out because the Graph API was not working in Safari. 
    // cookie: true, // enable cookies to allow the server to access the session 
    xfbml: true, // parse XFBML 
    channelUrl: window.location.protocol + '//' + window.location.host + '/fb/canvas/channel.html' 
}); 

तो मैं सोच रहा हूँ ... वहाँ एक अच्छा तरीका यह FB.api() अनुरोध में access_token क्वेरी पैरामीटर सेट करने के लिए है?

तो FB.init() कुकी ठीक से सेट हो जाता है, यह है कि क्या FB.api() अनुरोध पैरामीटर की तरह लग रहे:

access_token xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx 
callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

सफारी में (या जब cookieFB.init() विकल्प सेट नहीं है) FB.api() अनुरोध पैरामीटर की तरह लग रहे:

callback  FB.ApiServer._callbacks.xxxxxxxxxxxxxxx 
pretty  0 
sdk   joey 

अब ... जाहिर है कि मेरे ऐप में सर्वर पक्ष पर access_token उत्पन्न करने की क्षमता है ... मुझे आश्चर्य है कि क्या कोई तरीका है मेरे सर्वर-साइड-जेनरेट access_token का उपयोग करने के लिए मैन्युअल रूप से FB.api() सेट करें।

+0

मुझे लगता है कि ऐसा करने का एक और तरीका है। असल में, चूंकि हमारे पास एक बार प्रारंभिक पोस्ट अनुरोध पर कुकीज़ सेट करने का मौका है जो आईफ्रेम को पॉप्युलेट करता है, हम 'fbs_xxxxxxxxx' कुकी की नकल करने का अवसर उपयोग कर सकते हैं कि एफबी जेएस एसडीके' FB.init() 'के दौरान सेट करने का प्रयास करता है। अब ... कुकी मूल्य जो एसडीके सेट इस तरह दिखता है: 'fbs_xxxxxxxxx =" access_token = xxx और expires = xxx और secret = xxx और session_key = xxx और sig = xxx और uid = xxx "'। 'Access_token' और' expires' भागों आसान हैं।लेकिन मुझे अन्य हिस्सों को समझने में थोड़ी परेशानी हो रही है। –

उत्तर

4

ठीक है, मैं यह काम करने के लिए मिल गया है पर एक अच्छा उदाहरण मिल सकते हैं। मैं पता चला है आप FB.api() का उपयोग करने के FB.init()cookie: true विकल्प की जरूरत नहीं है --you मैन्युअल ACCESS_TOKEN पारित कर सकते हैं:

FB.api("/me/apprequests/?access_token="+access_token, function (response) {}); 

कहाँ access_token एक जे एस चर है कि आप पृष्ठ लोड पर सर्वर साइड सेट है।

<script> 
    var access_token = "<%= @access_token %>"; 
</script> 

और @access_token OAuth ACCESS_TOKEN प्रारंभिक पोस्ट अनुरोध में अपने कैनवास पृष्ठ पर पारित हो कि है: यहाँ एक ERB उदाहरण है।

3

सफारी के साथ सीमा यह है कि यदि डोमेन माता-पिता के लिए अलग है तो यह आईफ्रेम की सामग्री बनाने या उपयोग करने की अनुमति नहीं देगा ... जब तक कि उपयोगकर्ता पहले इसके साथ इंटरैक्ट नहीं करता। समस्या सफारी के लिए अद्वितीय नहीं है वेबकिट नहीं, इसलिए क्रोम ठीक है।

इस समस्या में खुद को चलाने के बाद (कई दर्दनाक समय), एक समाधान है जो चारों ओर एक अच्छा काम प्रतीत होता है। तकनीक जावास्क्रिप्ट का उपयोग कर पेज बॉडी में एक फॉर्म इंजेक्ट करना है और फिर सबमिट ईवेंट ट्रिगर करना है। सफारी इसे उपयोगकर्ता इंटरैक्शन के रूप में स्वीकार करता है और कुकीज़ को अनुमति देता है।

आप Facebook डेवलपर मंच here

+0

आह, बुरा विचार नहीं है। मुझे पता है कि जेएस-ट्रिगर फॉर्म सबमिट है कि फेसबुक आईफ़्रेम कैनवास पृष्ठों को आईफ्रेम के डोमेन के लिए कुकीज़ सेट करने की इजाजत देता है, यहां तक ​​कि सफारी जैसे ब्राउज़र पर जो आमतौर पर एक्स-डोमेन iFrame अनुरोधों पर कुकीज़ सेट नहीं करते हैं (http://stackoverflow.com/प्रश्न/4701922/कैसे-करता-फेसबुक-सेट-क्रॉस-डोमेन-कुकीज़-iframes-ऑन-कैनवास-पृष्ठ के लिए)। हालांकि, ऐसा लगता है कि iFrame (या जेएस रीलोड करने) के भीतर से एक फॉर्म सबमिट करने की घटना को ट्रिगर करने जैसा लगता है, वह सबसे अच्छा उपयोगकर्ता अनुभव नहीं है। साथ ही, सफारी टीम देख सकती है कि सुरक्षा छेद के रूप में जो उपयोगकर्ताओं को ट्रैक करने वाले विज्ञापनों के खिलाफ रक्षा को रोकता है। –

+0

उपयोगकर्ता से अधिकांश को मुखौटा करना संभव है। मैंने एक कार्यान्वयन का उपयोग किया है जो लैंडिंग पृष्ठ पर उपयोगकर्ता एजेंट सर्वर पक्ष के लिए परीक्षण करता है, और फिर सफारी उपयोगकर्ताओं के लिए फॉर्म चाल करने के लिए एचटीएमएल परोसता है। एक स्थान शीर्षलेख के साथ पुनर्निर्देशन के रूप में संक्रमण लगभग तेज़ है। – leebriggs

+0

दिलचस्प। खैर मैं निश्चित रूप से इसे ध्यान में रखूंगा। अभी के लिए मुझे एहसास हुआ है कि 'एफबी.एपीआई'() 'का उपयोग करने के लिए आपको कुकी सेट करने के लिए वास्तव में एफबी जेएस एसडीके की आवश्यकता नहीं है - इसलिए ब्राउज़र-विशिष्ट नियमों की आवश्यकता नहीं है। –

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