2012-11-29 9 views
8

zu bekommen Das gibt mir ziemlich Kopfschmerzen. Ich habe eine Page-Tab-Anwendung, wo DB-Interaktion die Facebook-Benutzer-ID verwendet, um Daten zuzuordnen und zu speichern und auch um Benutzerberechtigungen zu überprüfen. Bis ein schwaches vor allem gut funktioniert, aber jetzt mit den bevorstehenden Dezember-Änderungen dieses Setup funktioniert nicht mehr:"Ein aktives Zugriffs-Token muss verwendet werden" (Dez 2012) && Die richtige Art, Facebooks PHP-SDK für Ajax-Aufrufe einzurichten, um die Benutzer-ID

config.php:

$facebook = new Facebook(array(
'appId' => $app_id, 
'secret' => $app_secret, 
'cookie' => true 
)); 

index.php: enthält Konfig. php und erhält die signierte Anfrage (nicht wichtig für die Frage

javascript.js: ruft die Lese-user-status.php und behandelt die Daten

lesen-user-status.php: gibt Json-Antwort enthält config.php und ruft die $ facebook -> getUser() - Funktion, um die uid

Selbst wenn aus dem Index genannt zu bekommen .php direkt nach dem Seitenladen, bekomme ich manchmal die uid und manchmal nicht. Strangulate genug muss ich normalerweise ein wenig warten, bis ich die Seite neu lade und dann funktioniert es wieder. Aber das ist nicht immer der Fall. Das alles ist nur sehr seltsam für mich.

EDIT: Sollte das diesen Aufruf erwähnt haben:

$uid = $facebook -> getUser(); 
if ($uid) { 
    try { 
     // Proceed knowing you have a logged in user who's authenticated. 
     $user_profile = $facebook -> api('/me'); 
    } catch (FacebookApiException $e) { 
     error_log($e); 
     $uid = FALSE; 
    echo "EXCEPTION $e"; 
    } 
} 

gibt out „AUSNAHME Eine aktive Zugriffstoken verwendet werden, müssen Informationen über den aktuellen Benutzer abfragen“.

Ich kenne da ziemlich viele ähnliche Fragen, aber keine der Antworten war hilfreich für mein spezielles (und wahrscheinlich auch für die neuen brechenden Änderungen) Problem.

EDIT2: Ich nehme nun an, dass es ein SDK-Bug ist (https://developers.facebook.com/bugs/238039849657148, dank CBroe). Empfehlungen für einen Workaround sind natürlich sehr willkommen.

EDIT 3 Notlösung Jedesmal, wenn Sie eine Ajax-Anfrage machen, schreiben Sie den Token Sie aus der FB.getLoginStatus oder FB.login bekommen und es heraus in der PHP-Datei lesen und über $ facebook eingestellt -> setAccessToken. Nicht unter allen Umständen geeignet (Sie müssen definitiv post verwenden), ist langsamer und bringt einige Sicherheitsprobleme, funktioniert aber immer noch.

+0

Haben Ihre Berechtigungen Offlinezugriff? – Hemc

+2

Klingt so, als ob Sie von dem Bug betroffen sind, den ich Anfang November gemeldet habe, https://developers.facebook.com/bugs/238039849657148 Sie haben es bestätigt und sagen, dass sie an einer Lösung arbeiten - aber da die Änderung nur ein ist In wenigen Tagen sollten sie sich ein wenig beeilen ... – CBroe

+0

@CBroe: Danke, ich hatte das Gefühl, dass es ein Bug sein könnte, da er so ein seltsames und unregelmäßiges Verhalten zeigt, aber diese Bug-Seite nicht gefunden hat. –

Antwort

8

Klingt wie Sie durch den Fehler betroffen sind, ich Anfang November berichtet, https://developers.facebook.com/bugs/238039849657148

Sie haben bestätigt, und sagen, dass sie an einer Lösung arbeiten - aber da die Änderung ist nur ein paar Tage weg jetzt, sie sollten ein wenig ...

+1

Update: Sie haben dies behoben - die Aktualisierung auf die neueste Version des PHP SDK (v.3.2.2) sollte dieses Problem lösen (ich habe es für mich getan). – CBroe

+0

Nein, das letzte Update löst nichts. Es scheint nach dem Zufallsprinzip zu arbeiten – FidoBoy

+0

Immer noch dieses Problem, jedoch Workaround wie nach ersten Kommentar auf FB-Link (dh speichern Token in einer Sitzung var) schien den Trick zu tun. –

0

versuchen Sie, indem Sie Zugriffstoken hinzufügen, um anzufordern.

$accessToken = $facebook->getAccessToken(); 
$user_profile = $facebook->api('/me?access_token=' . $accessToken); 
+0

Das accessToken verhält sich genauso wie der Benutzer-Daten-Anruf. Manchmal wird es korrekt gesendet, manchmal nicht. Wenn es einmal eingestellt ist und ich es in einer Session-Variable abspeichere, funktioniert es, aber nur für die Dauer der Session, danach scheint es überhaupt nicht mehr zu funktionieren, bis ich die App deauthirze und die App wieder autorisiere. –

0

fand ich eine Behelfslösung für diese, bis sie fest ist (was es scheint, wird nicht in der Zeit zu sein, bis die Änderungen stattfinden). Jedes Mal, wenn Sie eine Ajax-Anfrage machen, posten Sie das Token, das Sie vom FB.getLoginStatus oder FB.login bekommen, und lesen es in der PHP-Datei aus und stellen es über $ facebook -> setAccessToken ein. Nicht unter allen Umständen geeignet (Sie müssen definitiv post verwenden), ist langsamer und bringt einige Sicherheitsprobleme, funktioniert aber immer noch.

2

ich habe diese Arbeit beeilen, indem sie folgende ...

if(!$user){ 

$loginUrl = $facebook->getLoginUrl(array(
       'scope' => 'email', 
       'redirect_uri' => $app_url 
       )); 
    header('Location: ' . $loginUrl); 
} 

ich meine App auch mit integriert werden hinzugefügt:

  • Webseite mit Facebook-Login
  • App auf Facebook
  • Seite Tab
+0

Havent versuchte dies, da die App bereits draußen ist, aber es ist schön, so viele brauchbare Antworten für diese Frage zu haben. –

0

wenn es Sie Glück haben und Ihre Version von PHP-sdk-Register nach wie vor Session-Variablen als direkt nach _graph Methodendeklaration:

 
//find this method below 
     protected function _graph ($path, $method = 'GET', $params = array()) 
     { 

//paste right after _graph method declaration code below: 
      if (isset($_SESSION["fb_".$this->getAppId()."_access_token"])) 
      { 
       $this->setAccessToken($_SESSION["fb_".$this->getAppId()."_access_token"]); 
      } 
//till here 
//and you are good to go 
//remember: your version of sdk must be registering access token variable in session 
//right after ajax call 
//i used git to get version before last commit of sdk published on github