2011-05-15 12 views
5

के साथ FB.login मैंने एक कैनवास पृष्ठ स्थापित किया है जो एक फॉर्म सबमिट बटन पर क्लिक करने पर एक FB.login है। निम्नलिखित अनुरोध के दौरान यह $ facebook-> एपीआई ('/ me') (गीथब से अंतिम एपीआई संस्करण) के माध्यम से उपयोगकर्ताओं के डेटा तक पहुंचने का प्रयास करता है। यह फ़ायरफ़ॉक्स और क्रोम में काम करता है, लेकिन सफारी और आईई में नहीं, जहां एपीआई "ऑथ टोकन आवश्यक" के साथ विफल रहता है। क्या किसी को पहले से ही इस समस्या का सामना करना पड़ा है या कोई विचार है कि इसका कारण क्या हो सकता है?PHP एपीआई

बीआर फिलिप

संपादित करें:

मैं एक फार्म के क्लिक करें घटना के अंदर FB.login फोन सबमिट बटन:

$('.form-submit', this).click(function() { 
    FB.getLoginStatus(function(response) { 
    if (response.session) { 
     form.submit(); 
    } else { 
     FB.login(function(response) { 
     if(response.session && (permissions == '' || response.perms)) { 
      form.submit(); 
     } 
     else { 
     } 
     },{perms:permissions}); 
    } 
    }); 
    return false; 
}); 

सर्वर साइड पर बस में php-api वस्तु का निर्माण और उपयोगकर्ता डेटा प्राप्त करने का प्रयास करें:

$facebook = new Facebook(array(
    'appId' => $appid, 
    'secret' => $appsecret, 
    'cookie' => TRUE, 
)); 
if ($facebook) { 
    try { 
    $me = $api->api('/me'); 
    } 
    catch (Exception $exc) { 
    // Failure in Safari and IE due to invalid auth token 
    } 
} 

हस्ताक्षर_रेक्वेस्ट एक हिडिए के अंदर पारित किया गया है एन फार्म तत्व।

+0

मेरे प्रिय आपको अपना पूरा कोड प्रदान करना चाहिए। समस्या आपके अंत में हो सकती है। यह एक आम समस्या नहीं है –

+0

क्या आप कुछ कोड प्रदान कर सकते हैं? मुझे लगता है कि यह आपके सत्र/कुकीज़ या कुछ जेएस पॉपअप से संबंधित नहीं है .. क्या आपको अपनी सफारी के कंसोल में कोई त्रुटि है? – dwarfy

+0

बस ऊपर अपना कोड जोड़ा गया। कुछ "असुरक्षित अनुरोध" हैं- चेतावनी, लेकिन वे हमेशा फेसबुक पर दिखाई देते हैं। –

उत्तर

5

मुझे जेएस एफबी लॉगिन सामग्री के साथ बहुत सारी परेशानी थी। मैं pha fb api से oauth और getLoginUrl फ़ंक्शन का उपयोग करके सरल रीडायरेक्ट लॉगिन का उपयोग करने की अनुशंसा करता हूं।

तो मूल रूप से आप इसे PHP से करते हैं, तो आप जांचते हैं कि क्या आपका सत्र है, अगर आप getLoginUrl का उपयोग नहीं करते हैं और उस पृष्ठ पर रीडायरेक्ट करते हैं, तो आपका उपयोग तब आपके ऐप/साइट पर वैध सत्र के साथ रीडायरेक्ट किया जाएगा (यदि वह स्वीकार करता है)।

क्या इससे मदद मिलती है? मैं वास्तव में किसी भी ब्राउज़र पर एफबी जेएस लॉगिन काम करने की कोशिश कर रहा हूं और मैं नहीं कर सका, मैंने तब से अपने सभी ऐप्स में पूर्ण सफलता के साथ सरल रीडायरेक्ट लॉगिन विधि में स्विच किया है।

+0

बहुत बहुत धन्यवाद! यह पॉपअप लॉगिन के रूप में "सुंदर" नहीं है, लेकिन कम से कम यह हर जगह काम करता है। –

+0

इस पर पूरी तरह से सहमत हैं। मैं फेसबुक जावास्क्रिप्ट एसडीके का उपयोग करके खेद व्यक्त किया। यह वास्तव में मुझे कुछ ब्राउज़रों द्वारा अवरुद्ध फेसबुक विंडो पॉपअप पर अध्ययन करने के लिए बहुत समय लगा। अंत में, मैंने रीडायरेक्ट एक समाधान का उपयोग करने का फैसला किया। – David

8

मुझे एक ही समस्या थी और मैंने नीचे एक समाधान शामिल किया है।

मुझे विश्वास है कि ऐसा इसलिए होता है क्योंकि जावास्क्रिप्ट लॉगिन प्रयास पर आपके सर्वर को कभी भी एक्सेस टोकन प्राप्त नहीं होता है। जावास्क्रिप्ट केवल आपके ब्राउज़र और फेसबुक.com के बीच डेटा पास कर रहा है, इसलिए आपके सर्वर को पता नहीं है कि प्रमाणीकरण स्थिति क्या है। पृष्ठ को रीफ्रेश होने पर आपका सर्वर केवल नए एक्सेस टोकन प्राप्त करेगा; यह वह जगह है जहां फेसबुक पहुंच टोकन पर हाथ रखता है।

मेरा समाधान है। FB.login के माध्यम से एक सफल लॉगिन पर आपको प्रतिक्रिया ऑब्जेक्ट प्राप्त होगा और इसके अंदर एक access_token है। आपको बस इतना करना है कि इस स्क्रिप्ट को अपनी स्क्रिप्ट में किसी भी तरह से एक्सेस करें। यहां एक उदाहरण दिया गया है:

// Hold the access token 
var js_access_token = ""; 

// Connect to facebook 
FB.login(function(response) { 
    if (response.session) { 
    if (response.perms) { 
     // user is logged in and granted some permissions. 
     // Save the access token 
     js_access_token = response.session.access_token; 
     // Do stuff on login 
    } 
    } 
}); 

फिर आप किसी भी अनुरोध के साथ एक्सेस टोकन शामिल करते हैं। मैंने एक अजाक्स उदाहरण चुना है।

$facebook = new Facebook(array(
    'appId' => $appid, 
    'secret' => $appsecret, 
    'cookie' => TRUE, 
)); 
if ($facebook) { 

    // If we get the access token from javascript use it instead 
    if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) { 
    $facebook->setAccessToken($_REQUEST['js_access_token']); 
    } 

    try { 
    $me = $api->api('/me'); 
    } 
    catch (Exception $exc) { 
    // Failure in Safari and IE due to invalid auth token 
    } 
} 

आशा इस

+0

यह काम करता है, धन्यवाद! – artvolk

+3

यह गलत है! हमें क्लाइंट और सर्वर अनएन्क्रिप्टेड के बीच एक्सेस टोकन नहीं भेजना चाहिए। यहां नई प्रमाणीकरण विधि के बारे में पढ़ें: https://developers.facebook.com/blog/post/525/ – oliland

+0

@oliland धन्यवाद। लिंक के लिए +1 –

0

मैं कोनोर के जवाब पसंद आया के रूप में मैं ग्राहक से मेरी पहुँच टोकन पारित करने के लिए किया था मदद करता है:

// Communication back to server. 
$.ajax({ 
    url: 'myurl.php', 
    data: { 
    js_access_token: js_access_token // Including the js_access_token 
    }, 
    success: function(data) { 
    console.log(data); 
} 
}); 

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

वैसे भी, यहाँ है कि मैं क्या समाप्त हो गया साथ मामले में यह किसी को भी

<a id="start-button" href="#">Start</a> 
<form id="entry-form" action="nextpageurl" method="post"> 
    <input type="hidden" name="access_token" /> 
</form> 

<script> 
$(document).ready(function() { 
    $('#start-button').click(function(e) { 
     e.preventDefault(); 
     FB.login(function (response) { 
      if (response.authResponse) { 
       $('#entry-form input').val(response.authResponse.accessToken); 
       $('#entry-form').submit(); 
      } else { 
       alert('Permissions required'); 
      } 
     }, {}); 
    }); 
}); 
</script> 

में मदद करता है और फिर PHP में, कोनोर के जवाब के रूप में बहुत ज्यादा एक ही है, लेकिन $ _POST वर से टोकन हो रही है।

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