2012-08-30 11 views
8

ich versuche ich Nach einem Blick SDK mitErste langlebiges Zugriffstoken mit setExtendedAccessToken() gibt kurze Token leben

$facebook->setExtendedAccessToken(); 
$access_token = $facebook->getAccessToken(); 

langlebigem Zugriffstoken erweitert werden gefunden, dass setExtendedAccessToken() Funktion setzt langlebige Zugriffstoken in

protected static $kSupportedKeys = 
array('state', 'code', 'access_token', 'user_id'); 

mit

$this->setPersistentData(
    'access_token', $response_params['access_token'] 
); 

und getAccessToken() kurzlebig Zugriffstoken von

protected $accessToken 

so zurückkehrt, was ist der Zweck der setExtendedAccessToken(), da es nichts zurückliefert?

+0

Ich hoffe auch, dass jemand auf diese Frage jede hilfreiche Antwort geben könnte. –

Antwort

12

@Julian. Vielen Dank für die Inspiration hier. Ich konnte dies ohne Änderung der Core-FB-API-Dateien machen.

Was passiert, ist der setExtendedAccessToken Anruf sendet den Wert an setPersistentData, die dann sendet es in Sitzung über constructSessionVariableName.

Also, wenn wir es aus der Sitzung bekommen, und dann setzen Sie es in das Facebook-Objekt, wir sind alle eingestellt.

Hier ist mein Code:

// ask for the extended token and get it from session ... 
$facebook->setExtendedAccessToken(); 
$access_token = $_SESSION["fb_".FB_APP_ID."_access_token"]; 
// now set it into the facebook object .... 
$facebook->setAccessToken($access_token); 
// now our fb object will use the new token as usual ... 
$accessToken = $facebook->getAccessToken(); 
+0

Schön, danke für den besseren Workaround! Froh, dass ich helfen konnte. –

+0

Haben Sie dafür eine Cross-Browser-Version? Diese Sitzung wird manchmal nicht eingestellt, zum Beispiel mit Mac OSX Opera – Davit

5

Nach weiteren Versuch herumzustochern base_facebook.php, ich habe folgendes entdeckt:

  • setExtendedAccessToken(); wird eine kurzlebige Zugriffstoken auszutauschen und Facebook wird einen richtigen erweiterten Zugriffstoken zurück.
  • setExtendedAccessToken(); speichert dies im persistenten Datencache, aber das bedeutet nicht getAccessToken(); kann darauf zugreifen, weil getAccessToken(); nicht den persistenten Cache abfragt. Darüber hinaus scheint die Klasse, um die persistenten Daten als „ausfallsicher“ zu behandeln, und nur verwendet es, wenn alle anderen Versuche, Daten abzurufen, sind gescheitert (das heißt, nach signed_request Überprüfung und ein code Parsing).
  • In unserem Fall die Zugriffstoken über setExtendedAccessToken(); zurückgegeben werden, sind die jüngsten Zugriffstoken, so dass ich in einem fix gehackt. Fügen Sie die folgende Zeile am unteren Rand des setExtendedAccessToken();

    // Also set the publically accessible access token value to this new extended token

    $this->accessToken = $response_params['access_token'];

  • Caveat: Auch wenn wir jetzt die neue erweiterte Zugriffstoken haben, nachfolgende Abfragen zu Facebook ein Zugriffstoken abzurufen (zB nach einer Seitenaktualisierung) wird dasselbe alte kurzlebige Zugriffstoken zurückgegeben. * facepalm *

  • Auch wenn sich der Benutzer abmeldet (wodurch das kurzlebige Token abläuft) und sich erneut anmeldet, gibt Facebook erneut ein kurzlebiges Zugriffstoken zurück.
  • Auch wenn dies der Fall ist, wird setExtendedAccessToken(); das gleiche erweiterte Zugriffstoken zurückgeben, das Sie zuvor abgerufen haben. Dieses Token kann weiterhin verwendet werden, um Benutzerinformationen abzufragen.

Also, das sieht aus wie ein Facebook-Bug, so sehr ich es hasse es zu sagen. Wir können es mit dem Hack, den ich oben beschrieben habe, umgehen, und alle nachfolgenden Aufrufe zum Abrufen eines Zugriffstokens werden nur ein kurzlebiges Zugriffstoken zurückgeben, das für dasselbe erweiterte Zugriffstoken immer wieder ausgetauscht werden kann.


Original-Antwort

Nach this answer, die neuen Zugriffstoken werden in den persistenten Daten gespeichert (wie Sie auch in Ihrer Frage angegeben haben) und können über $facebook->getAccessToken(); zugegriffen werden.

zwei relevante Hinweise:

  • This page erwähnt auch, dass, wenn das kurzlebige Zugriffstoken für einen erweiterten Zugriffstoken ausgetauscht wird, das Token selbst kann oder nicht ändern kann, obwohl die Ablaufzeit haben sollte aktualisiert, um den längeren Ablauf zu reflektieren. Vielleicht, wenn Sie $facebook->getAccessToken(); anrufen, erhalten Sie nur das gleiche Token zurück, aber sein Ablauf hat sich geändert?
  • Der Aufruf zum Austausch eines kurzlebigen Zugriffstokens für einen erweiterten Token kann nur einmal pro Tag pro Benutzer erfolgen. Ich weiß nicht, warum das so ist, und ich weiß nicht, ob dieser Zähler zurückgesetzt wird, wenn ein Benutzer sich entscheidet, die App zu entmächtigen und sich erneut zu autorisieren.

Von der Facebook-Dokumentation:

Wenn ein Benutzer Ihrer Website besucht mit einem bestehenden, gültig, kurzlebigen Benutzern access_token, haben Sie die Möglichkeit, die Ablaufzeit des Zugriffstoken zu erweitern. Unsere Plattform verlängert die Ablaufzeit nur einmal pro Tag., also auch wenn ein Nutzer Ihre Website mehrmals am Tag revidiert, wird das Token beim ersten Mal verlängert. (Hervorhebung von mir)

Ich glaube, dies der Fall ist, weil schlampig Programmierer $facebook->setExtendedAccessToken(); bei jeder sich bietenden Gelegenheit, in der Hoffnung, immer Abrufen eines erweiterten Zugriffstoken nennen. (Statt der bevorzugten Verhalten, die nur $facebook->setExtendedAccessToken(); aufrufen würde, wenn das, was Sie derzeit haben, ist ein kurzlebiges Access Token - aber wie würden Sie auch sagen, wenn Sie das Ablaufdatum gespeichert haben, die an und für sich isn 't that reliable ...!)

Meine Annahme ist, dass, wenn ein Benutzer die App ent-autorisiert oder das Token andernfalls ungültig macht, das Limit zurückgesetzt wird und Sie erneut ein Token mit erweitertem Zugriff abrufen können wenn ein kurzlebiges Zugriffs-Token übergeben wird. Dies erfordert jedoch weitere Tests, also nehmen Sie bitte diesen Absatz mit einem Körnchen Salz.

+0

Julian H.Lam scheint zu funktionieren, wenn ich nicht durch die Facebook-Chrome gehe, vielleicht bedeutete es, dass es mit Webseiten arbeitet, die facebook verwenden und nicht die Web-Apps, die in der fb-Chrome angezeigt werden. – alexl