Erfrischende Facebook-Sitzung von einer Iframe-Anwendung

stimmen
13

Ich habe eine Facebook iframe-Anwendung, die vollständig extern ist. Damit meine ich, dass, sobald ein Benutzer auf die Leinwand URL greift auf die Anwendung zu laden, werden alle Links in der iframe App zu meinem Server gehen, und die Leinwand Seite wird nie aktualisiert, wenn der Benutzer irgendwo navigiert sonst auf Facebook und kommt zurück (oder hat eine Aktualisierung des Browsers).

Auf der Anfangslast der App , wo Facebook die iframe schafft, werde ich alle üblichen Parameter wie fb_sig_user geführt , die mir eine interne app Sitzung basierend auf der Facebook - Benutzer erstellen können. Diese App - Sitzung (das ist nicht die Facebook - Sitzung, es ist meine eigene App - Sitzung) ist alles was ich brauche , damit der Benutzer mit der App arbeiten.

Das Problem kommt eine Stunde später. Wenn der Benutzer den Computer verlässt, oder er verwendet die App für mehr als eine Stunde läuft die Facebook-Sitzung. Es gibt einige App-Seiten, die fetching Freund Informationen benötigen, und sobald die FB-Sitzung abgelaufen ist, diese Seiten zu brechen, Fehler werfen wie „Fehler: Session-Key ungültig oder nicht mehr gültig“.

Meine Frage ist, ob es einen Weg gibt, die Benutzerfacebook-Sitzung innerhalb von einem Iframe-Anwendung zu aktualisieren, damit er nicht eine Stunde später abläuft. Führen Sie einen der API-Aufrufe dies tun? Gibt es eine Facebook Connect Trick etwas ping? Gibt es eine endgültige Methode sich am Leben zu erhalten? Ich habe nicht in der Lage gewesen, keine Beispiele zu finden, die diese gezielt ansprechen.

Veröffentlicht am 07/05/2009 um 18:38
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
21

Der Sieg ist mein!

Es gibt eine fast gänzlich ohne Papiere Facebook - Funktion mit iframe - Sitzungen zu tun, dass ich einen gefunden vagen Hinweis auf in meiner Forschung. Diese Seite ist nicht wirklich erklärt jedoch gut, und erst nach mehreren Stunden von verschiedenen Sitzungsschlüssel in meiner iframe beobachten war ich in der Lage, herauszufinden , was los war.

Zuvor war meine iframe App die übliche Runde des Empfangsparameters , fb_whateverwenn die anfängliche iframe Last aufgetreten. Also in meiner Anwendung, ich tat dies bei jeder Anfrage:

if (isset($_REQUEST['fb_sig_session_key'])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];

Dieser Code würde den Empfang fb_sig_session_keyauf der anfänglichen app Last, und ich würde es weg in einem lokalen Eichhörnchen $_SESSIONfür die Verwendung mit der API. Es in der lokalen Sitzung zu speichern ist notwendig, da fb_sig_session_keynie wieder übergeben wird , wenn Sie die gesamte App iframe laden.

So traten die Probleme auf, wenn dieser Sitzungsschlüssel eine Stunde später abgelaufen.

Am Nachdem ich vage Referenzseite , begann ich alle die Prüfung $_REQUESTVariablen war ich immer. Es stellt sich heraus , dass auch auf einem internen Link in Ihrem iframe App, Facebook die Anforderung entlang einiger Parameter zu übergeben modifiziert. Aus irgendeinem Grund haben sie eine ganz andere, aber auch gültig Sitzungsschlüssel, der zusammen mit jedem iframe Anfrage kommt!

Dieser Parameter wird nach Ihren Facebook - Anwendung api Schlüsseln mit dem Namen. Also , wenn Ihre Anwendung API - Schlüssel ist „xyz123“ erhält jeder Anfrage in Ihrem iframe einen Parameter aufgerufen xyz123_session_key(wie auch einige andere, wie xyz123_expiresund xyz123_user).

Nachdem ich die zugehörige Ablaufzeit für die Hauptsitzung (das Original fb_sig_session_key) und dieser iframe-only - Sitzung ( xyz123_session_key) erschien das Licht am Ende des Tunnels: der iframe-nur gelegentlich wird die Ablaufzeit Sitzungsschlüssel tatsächlich aktualisiert . Ich habe nicht bestimmt , wann oder wie (ich nehme an, es ist ein Ajax - Ping an einem gewissen Punkt), aber dennoch, es erfrischt.

Ich wartete auf die ursprüngliche fb_sig_session_keySitzung abläuft, und sicher genug , um den Freund bezogenen Seiten in meiner app gestartet Fehler Husten. An diesem Punkt habe ich meine lokal gespeicherten Sitzungsschlüssel an den neuen iframe-only xyz123_session_key, und das Problem war gelöst. Diese Sitzung funktioniert genauso gut wie das Original!

So ist mein letzter Code fix den Sitzungsschlüssel lokal zu speichern, wie folgt:

$iframeSessionKeyName = $CONFIG['facebook']['apiKey'] . '_session_key';
if (isset($_REQUEST[$iframeSessionKeyName])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST[$iframeSessionKeyName];
}
else if (isset($_REQUEST['fb_sig_session_key'])) {
    $_SESSION['fb_sig_session_key'] = $_REQUEST['fb_sig_session_key'];
}
if (! empty($_SESSION['fb_sig_session_key'])) $this->facebook->api_client->session_key = $_SESSION['fb_sig_session_key'];

Dies gibt den Vorzug der „iframe-only“ -Taste.

Edit: Meine ursprüngliche Annahme , dass die „iframe-only“ Schlüssel über eine Art von Ajax - Methode aktualisiert wurde , war falsch, es stellt sich heraus , diese Werte in einem Cookie von Facebook eingestellt sind. Dies führt zu einigen Cross-Domain - Probleme , wenn diese Cookies verwenden. Eine Einstellung P3P Cookie - Politik wird lindern diese mit den meisten Browsern, außer Safari. Es gibt immer noch keine gute Arbeit um für Safari.

Beantwortet am 08/05/2009 um 00:32
quelle vom benutzer

stimmen
2

setzen Sie einfach

header('P3P: CP="CAO PSA OUR"');

oben auf Ihrer Seite und Sie werden Ihre Sitzung in der iframe nicht verlieren.

Ich habe bemerkt auch, dass dieser Thread ist gut 2 ½ Jahre alt. Ich stolperte über benutzt Google. Vielleicht wird mein Beitrag jemand anderem helfen, die über diese kommt.

Beantwortet am 28/01/2012 um 11:46
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more