2013-01-05 21 views
6

Gerçekten garip, Facebook SDS (v 3.2.2) kullanarak Facebook oturumu ($ user = 0) kaybolur gibi görünüyor. JS SDK'nın Facebook oturumunu kurtarmak için sayfamı yeniden yüklemesi gerekiyor. Bu problem şimdi oluyor ve bazen Facebook oturumu kayboluyor, bazen de gayet iyi çalışıyor.Facebook PHP SDK oturumu kaybedildi, ihtiyaç duydu JS SDK yeniliği

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; 
    } 
} 

Ana sorun şu ki, $ kullanıcı = $ facebook-> getUser(); 0 döndürür. Ancak, kullanıcı gerçekten bağlandığından, JS SDK auth.login olayını algılar ve sayfayı yeniden yükler (başka bir garip şey, auth.login kullanıyorum çünkü auth.authResponseChange olayı her saniye tetikleniyor). Şimdi $ user = $ facebook-> getUser(); kullanıcının kullanıcı kimliğini döndürür. Facebook Developer

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(); 
    }); 
}; 

ben Uygulama Domain (domain.com) ve Site Url ( http://domain.com/) tanımladı. Şimdiye kadar Site URL'sini eğik çizgi/sonda olmadan denediniz, sorunu çözmediniz.

Neler olduğu hakkında bir fikriniz var, neden Facebook PHP SDK'sı kullanıcının oturumunu hemen tespit etmiyor/kullanıcının oturumunu kaybetmeye devam ediyor ve yeniden yüklemeye mi ihtiyacı var? Bu sorun gerçekten kötü bir UX'e neden oluyor.

Çok teşekkürler! Robin

cevap

5

Son zamanlarda aynı sorunu genelinde geldim

, 5mins sonra veya bu nedenle hareketsizlik bir yeniden yapmanız halinde, oturum kalıcı değil gibi görünüyor. Bazen çalışır, bazen olmaz.

Geçen hafta boyunca ona bakan ettik ve düşünebildiğim tek çözüm içeren bir sayfa yeniden yapmanız JS SDK'yı kullanmaktı:

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

Ama ben kabul, bu kadar UX açısından çok zarif bir çözüm değil. Sen (benim için yoktu) PHP SDK'deki cookie param, ve JS SDK'deki oauth param geçmek ve eğer inşaat görmelisiniz:

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

VE

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

Yine de yabancı, Github'dan latest PHP SDK'u yeniden indirdim ve bir sanal alan ortamına yükledim (Apache, PHP 5.4). Örnek (JS SDK ile) AS-IS çalıştı ve aynı sorunu var!

Şimdi yukarıdaki hardal kesmiyorsa, daha fazla öneri var.

, base_facebook.php etrafında kazma biraz yaptıktan sonra,

$facebook->getAccessToken(); Ancak size fayda $user eğer döner 0. yapacak geçerken, A BIT Öncelikle

SDK YUKARI DEĞİŞTİRME getCode() yönteminin, yetkilendirme kodunu sorgu parametrelerinden almak için aslında $_REQUEST kullandığını fark ettim.PHP Manual

, $ _REQUEST

varsayılan olarak $ _GET, $ _POST ve $ _COOKIE içeriğini içerdiğini ilişkilendirilebilir dizidir.

ANCAK

O $ _ POST veya $ _COOKIE, $ _GET için çok farklıdır.

Bu, kurulumunuza bağlı olarak biraz bugger olabilir. Bunun yerine, bu gibi göründüğünü base_facebook.php işlevi getCode() bulmak:

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; 
} 

ve yeni bir dizi/değişken içine sorguyu birleştirmek şöyle array_merge() kullanılarak $_GET, $_POST & $_COOKIE diziler dahil etmek (haydi $code_array diyebiliriz) :

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

Neler elde ettiğiniz, ilgili isteklerdeki tüm verileri içeren bir dizidir. Sadece bu (umarım) güzel bir iş yapmalıyım yani

\\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 

, devam edin ve işlevi içinde $code_array ile $_REQUEST değiştirin.

İSTEĞE - Access Token Ömür Uzatma

Bu isteğe bağlıdır, ancak ben yine de dahil. Yeni Uygulamaların çoğu zaten uzun süreli Erişim Simgelerine sahip olacak, ancak mevcut durumda mevcut erişim belirtecinizi dönüştürmek için $facebook->setExtendedAccessToken(); yöntemini kullanabilirsiniz.

Not: kadar gerçekte getAccessToken() yöntemle erişim jetonu almak önce $facebook->setExtendedAccessToken(); aramak zorunda.

Şimdi, kodu kullanarak size

$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.. 

SONUÇ $ _GET içine $ _REQUEST Breaking

, $ _ POST & $ _COOKIE (içermesine rağmen varsayılan olarak tüm üç) görünüyor olacak SDK (ler) tarafından belirlenen cookie'leri fazla sorun yaşamadan alabileceğimizden emin olun. Söylüyorum çünkü heck, kendimden% 100 emin değilim.

Durumumda çalışmasını sağlamak için yukarıdaki yöntemleri kullandım, bu nedenle, bu problem üzerinde çok fazla uyku kaybettiğim için, bazı bilgileri paylaşmayı ümit ediyorum ve geçerli bir çözüm bulamadım.

Bu yardımcı olur umarız!

DÜZENLEME: Ben

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

için

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

dan ben de yaptım bir şey API isteği oldu değişiyor, söylemeyi unutmuşum ve bir fark yarattı. :)

+0

Arama '$ facebook-> setExtendedAccessToken();' benim için çalıştı, teşekkürler. – Eldar

+0

Kökte ve iframe widget'larında/widgets adresinde bir uygulama vardı. Baz facebook'taki değişikliklere ek olarak , ayrıca/widget'larda iframe widget'ları için yeni bir uygulama oluşturmanız gerekiyordu. şimdi kök etki alanındaki oturum iyi görünüyor. –

+0

Bunu geri alıyorum, oturumlar iyi, ancak sayfa birkaç dakika boşta kaldıktan sonra kullanıcı hala 0'a geri dönüyor. –

0

Belki de Facebook PHP SDK'sı ajax olmadığı için ve PHP sayfalarını kullanıyoruz ve sunucularımız geçerli bir oturumu okumak için Facebook'tan kimlik doğrulama sürecinden daha hızlı yükleniyor. Facebook PHP SDK'nın gerektirdiği şey, uygulamalarımızdan oturum doğrulamasında sayfayı yenileyecek bir şeydir; bu, Facebook Javascript SDK'sında oluşturulmalı, ancak öyle görünmüyor.

İlgili konular