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.
Ich hoffe auch, dass jemand auf diese Frage jede hilfreiche Antwort geben könnte. –