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.