Seieren er min!
Det er en nesten helt udokumentert Facebook-funksjonen arbeider med iframe-økter, at jeg fant en vag referanse til i min forskning. Denne siden egentlig ikke forklare det godt likevel, og først etter flere timer med å se på ulike øktnøkler i min iframe var jeg i stand til å finne ut hva som foregikk.
Tidligere min iframe app var mottar den vanlige runde av fb_whateverparametrene når den første iframe belastning inntraff. Så i søknaden min, jeg gjorde dette på hver forespørsel:
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'];
Denne koden vil motta fb_sig_session_keypå den første app belastning, og jeg ville ekorn det bort til en lokal $_SESSIONfor bruk med API. Lagre den i den lokale økten er nødvendig, fordi fb_sig_session_keyaldri blir gått inn igjen med mindre du laste hele app iframe.
Så skjedde det problemer når denne sesjonsnøkkel utløpt en time eller så senere.
Etter å se på vag henvisning siden , begynte jeg å undersøke alle $_REQUESTvariablene jeg fikk. Det viser seg at selv om en intern kobling i iframe-app, Facebook endrer forespørsel til å passere langs noen parametere. For noen grunn, de har en helt annen, men også gyldig sesjonsnøkkel som kommer sammen med hver iframe forespørsel!
Denne parameteren er oppkalt etter din Facebook Application API-nøkkel. Så hvis din søknad API-nøkkel er "xyz123", hver forespørsel i iframe blir en parameter kalt xyz123_session_key(samt noen få andre, som xyz123_expiresog xyz123_user).
Etter å ha sett den tilhørende utløpstiden for hovedsesjon (den opprinnelige fb_sig_session_key) og dette iframe-bare økt ( xyz123_session_key), lyset i enden av tunnelen dukket opp: iframe-bare sesjonsnøkkel utløpstid faktisk blir oppdatert av og til . Jeg har ikke bestemt når eller hvordan (jeg antar det er en Ajax ping på et tidspunkt), men likevel, det oppdateres.
Jeg ventet på den opprinnelige fb_sig_session_keyøkten utløper, og sikker nok venn relaterte sider i min app begynte å hoste opp feil. På dette punktet, jeg byttet min lokalt lagret sesjonsnøkkel til den nye iframe-bare xyz123_session_key, og problemet ble løst. Den økten fungerer like bra som originalen!
Så mitt endelige koden fastsette å lagre sesjonsnøkkel lokalt som følger:
$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'];
Dette gir preferanse til "iframe-only" -tasten.
Edit: Min opprinnelige antagelse om at "iframe-only" -tasten ble oppdatert via en slags Ajax-metoden var galt, det viser seg disse verdiene er satt inn i en cookie av Facebook. Dette fører til noen på tvers av domener problemer når du bruker disse informasjonskapslene. Sette en P3P cookie politikk vil lindre dette med de fleste nettlesere, bortsett fra Safari. Det er fortsatt ingen gode arbeidet rundt for Safari.