2013-01-05 21 views
6

सच अजीब, ऐसा लगता है जैसे फेसबुक सत्र खो दिया है ($ उपयोगकर्ता = 0) पीएचपी SDK का उपयोग (v 3.2.2)। जेएस एसडीके को फेसबुक सत्र को पुनर्प्राप्त करने के लिए अपने पेज को पुनः लोड करने की आवश्यकता है। यह समस्या तब होती है अब और फिर, कभी कभी Facebook सत्र खत्म हो जाता है, कभी कभी यह सिर्फ ठीक काम करता है।फेसबुक पीएचपी एसडीके सत्र खो दिया है, जरूरत है जे एस एसडीके ताज़ा

session_start(); 

// Run Facebook API 
$facebook = new Facebook(array(
    'appId' => $config['facebook']['id'], 
    'secret' => $config['facebook']['secret'] 
)); 

// Fetch user 
$user = $facebook->getUser(); 
if($user) { 
    try { 
    // Just to be sure, add access token to each request 
    $user['access_token'] = $facebook->getAccessToken();  

    // Fetch user details 
    $user = $facebook->api('/me?access_token='.$user['access_token']);   
    } 
    catch (FacebookApiException $e) { 
    error_log($e); 
    $user = null; 
    } 
} 

मुख्य समस्या यह है कि $ उपयोगकर्ता = $ facebook-> getUser(); 0. रिटर्न लेकिन, जैसा कि उपयोगकर्ता वास्तव में जुड़ा हुआ है, जे एस एसडीके auth.login घटना का पता लगाता है और पेज (एक और अजीब बात है, मैं auth.login उपयोग करें, क्योंकि auth.authResponseChange घटना हर दूसरे निकाल दिया हो रही रखता है) को पुनः लोड करता। अब $ उपयोगकर्ता = $ facebook-> getUser(); उपयोगकर्ता के यूआईडी देता है।

window.fbAsyncInit = function() { 
    FB.init({ 
    appId : appId, 
    channelUrl : '//domain.com/signon/channel.php', 
    status  : true, 
    cookie  : true, 
    xfbml  : true 
    }); 
    FB.Event.subscribe('auth.login', function(response) { 
    location.reload(); 
    }); 
}; 

फेसबुक डेवलपर में मैं अनुप्रयोग डोमेन (domain.com) और साइट यूआरएल (http://domain.com/) में परिभाषित किया। पहले से ही, स्लेश अनुगामी बिना/के साथ साइट यूआरएल की कोशिश की समस्या का समाधान नहीं किया।

किसी भी विचार क्या हो रहा है, क्यों फेसबुक पीएचपी एसडीके उपयोगकर्ता के सत्र तुरंत पता नहीं लगा पाया/उपयोगकर्ता के सत्र खोने रखता है और एक बार पुनः लोड करने की आवश्यकता है? यह समस्या वास्तव में एक खराब यूएक्स का कारण बनती है।

बहुत बहुत धन्यवाद!

रॉबिन

उत्तर

5

मैं हाल ही में एक ही समस्या करवाते आए हैं, ऐसा लगता है कि अगर 5 मि के बाद या तो निष्क्रियता के आप एक बार पुनः लोड करते हैं, सत्र मौजूद नहीं होता। कभी-कभी यह काम करता है, कभी-कभी ऐसा नहीं होता है।

मैं पिछले सप्ताह के बारे में के लिए इस पर ध्यान देने किया गया है, और एकमात्र समाधान मैं के बारे में सोच सकता है जे एस एसडीके का उपयोग करने के साथ एक पृष्ठ पुनः लोड करने के लिए किया गया था:

FB.Event.subscribe('auth.login', function(response) { 
     window.location.reload(); 
    }); 

लेकिन मैं मानता हूँ, यह यूएक्स के मामले में एक बहुत ही सुरुचिपूर्ण समाधान नहीं है। आप PHP एसडीके में cookie परम, और जे एस एसडीके में OAuth परम पास करना चाहिए, और देखते हैं कि अगर काम करता है (यह मेरे लिए नहीं था):

$facebook = new Facebook(array(
    'appId' => $config['facebook']['id'], 
    'secret' => $config['facebook']['secret'], 
    'cookie' => true 
)); 

और

FB.init({ 
    appId : appId, 
    channelUrl : '//domain.com/signon/channel.php', 
    status  : true, 
    cookie  : true, 
    xfbml  : true, 
    oauth  : true 
    }); 

अजनबी अभी भी, मैंने गीथब से latest PHP SDK फिर से डाउनलोड किया और इसे एक सैंडबॉक्स वातावरण (अपाचे, PHP 5.4) पर अपलोड किया। मैं उदाहरण भाग गया (जे एस SDK के साथ) के रूप में-है और यह एक ही मुद्दा है!

अब अगर उपरोक्त सरसों काट नहीं आता है, तो मेरे पास कुछ और सुझाव हैं।

एसडीके एक बीआईटी

सबसे पहले बदलने, गुजर

$facebook->getAccessToken();

आप कोई अच्छा अगर $user रिटर्न 0. करना होगा हालांकि, base_facebook.php में चारों ओर खुदाई का एक सा करने के बाद, मैंने देखा कि विधि पैरामीटर से प्राधिकरण कोड पुनर्प्राप्त करने के लिए विधि getCode() वास्तव में $_REQUEST का उपयोग करती है।

पीएचपी मैनुअल से

, $ _REQUEST

एक साहचर्य सरणी कि डिफ़ॉल्ट रूप से $ _GET, $ _POST और $ _COOKIE की सामग्री शामिल हैं।

लेकिन

यह $ _ पोस्ट या $ _COOKIE $ _GET करने के लिए बहुत अलग है।

यह आपके सेटअप के आधार पर एक बगजर का थोड़ा सा हो सकता है। बजाय, कि इस तरह दिखता है base_facebook.php में समारोह getCode() लगता है:

protected function getCode() { 
if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
      isset($_REQUEST['state']) && 
      $this->state === $_REQUEST['state']) { 

     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } else { 
     self::errorLog('CSRF state token does not match one provided.'); 
     return false; 
    } 
} 

return false; 
} 

और एक नई सरणी/चर में क्वेरी विलय तो जैसे array_merge() का उपयोग कर $_GET, $_POST & $_COOKIE सरणियों शामिल करने के लिए (यह $code_array कॉल) :

$code_array = array_merge($_GET,$_POST,$_COOKIE); 

क्या आप के साथ अंत एक सरणी कि संबंधित अनुरोधों से सभी डेटा होता है। बस आगे बढ़ो और $code_array समारोह के अंदर के साथ $_REQUEST की जगह, यानी

\\replace $_REQUEST with $code_array; 
if (isset($code_array['code'])) { 
if ($this->state !== null && 
     isset($code_array['state']) && 
     $this->state === $code_array['state']) { //...and so on for the rest 

यह (उम्मीद) अच्छी तरह से काम करना चाहिए।

वैकल्पिक - अपने पहुंच टोकन लाइफटाइम विस्तार

यह वैकल्पिक है, लेकिन मैं फिर भी इसका शामिल थे। अधिकांश नए ऐप्स पहले से ही लंबे समय तक एक्सेस टोकन रहते हैं, लेकिन बस, यदि आप अपने मौजूदा एक्सेस टोकन को बदलने के लिए $facebook->setExtendedAccessToken(); विधि का उपयोग कर सकते हैं।

नोट: आप $facebook->setExtendedAccessToken(); कॉल करने के लिए इससे पहले कि आप वास्तव में getAccessToken() विधि के साथ अपने पहुंच टोकन प्राप्त की है।

अब, अपने कोड का उपयोग कर आप

$user = $facebook->getUser(); 
    if($user) { 
    try { 
    // Just to be sure, add access token to each request 
    $facebook->setExtendedAccessToken(); 
    $access_token = $facebook->getAccessToken(); 
    // Fetch user details 
    $user = $facebook->api('/me?access_token='.$access_token); 
    } 
//and so on.. 

निष्कर्ष

$ _GET में $ _REQUEST तोड़कर, $ _ पोस्ट & $ _COOKIE (भले ही यह भी शामिल है सभी तीन डिफ़ॉल्ट रूप से) लगता होगा सुनिश्चित करें कि हम एसडीके द्वारा सेट की गई कुकी को बहुत परेशानी के बिना ला सकते हैं। मैं कहता हूं क्योंकि बिल्ली, मैं वास्तव में 100% यकीन नहीं कर रहा हूं।

मैंने अपने मामले में काम करने के लिए उपरोक्त विधियों का उपयोग किया, इसलिए मैं कुछ ज्ञान साझा करने की उम्मीद कर रहा हूं, क्योंकि मैं इस समस्या पर बहुत अधिक नींद खो रहा हूं, और एक व्यवहार्य समाधान नहीं मिला।

आशा है कि इससे मदद मिलती है!

संपादित करें: मैं कुछ मैं भी किया था

$user_profile = $facebook->api('/me'); 

से एपीआई अनुरोध को बदलने

$user_profile = $facebook->api('/'.$user.'?access_token='.$access_token); 

लिए किया गया था उल्लेख करना भूल गया, है, और यह एक नई पहल की। :)

+0

बुला '$ फेसबुक> setExtendedAccessToken();' मेरे लिए काम किया है, धन्यवाद। – Eldar

+0

मेरे पास रूट/iframe विजेट्स/साइट्स पर साइट के साथ एक ऐप था। आधार फेसबुक में अपने परिवर्तन के अलावा, मैं भी/विजेट में आइफ्रेम विजेट्स के लिए एक नई एप्लिकेशन को बनाने के लिए किया था। अब रूट डोमेन पर सत्र ठीक लगता है। –

+0

मुझे लगता है कि वापस ले, सत्र ठीक हैं, लेकिन उपयोगकर्ता अभी भी 0 लौटा रहा है पृष्ठ के बाद कुछ मिनट के लिए निष्क्रिय है। –

0

हो सकता है कि क्योंकि फेसबुक पीएचपी एसडीके अजाक्स नहीं है और हम PHP पृष्ठों का उपयोग कर रहे है और हमारे सर्वर तेजी से फेसबुक से प्रमाणीकरण प्रक्रिया एक वैध सत्र वापस पढ़ने के लिए की तुलना में लोड। क्या फेसबुक पीएचपी एसडीके की आवश्यकता है हमारे क्षुधा से सत्र सत्यापन पर पेज को ताज़ा करने के लिए कुछ है, इस फेसबुक जावास्क्रिप्ट एसडीके करने के लिए बनाया जाना चाहिए लेकिन ऐसा लगता है ऐसा नहीं है।

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