Forfriskende Facebook økt fra en iframe søknad

stemmer
13

Jeg har en Facebook iframe-applikasjon som er helt ekstern. Med dette mener jeg at når en bruker åpner lerretet URL for å laste programmet, alle leddene i iframe app gå til mine servere, og lerretet siden blir aldri uthvilt med mindre brukeren navigerer til et annet sted på Facebook og kommer tilbake (eller gjør en nettleser refresh).

På den første lasten på appen der Facebook skaper iframe, får jeg passerte alle de vanlige parametere som fb_sig_user som tillater meg å lage en intern app-økt basert på facebook bruker. Dette programmet økten (som er ikke Facebook-session, det er min egen app økt) er alt jeg trenger for å tillate brukeren å arbeide med programmet.

Problemet kommer en time senere. Hvis brukeren forlater datamaskinen, eller bruker app for mer enn en time, utløper Facebook økten. Det er noen app sider som krever henting venn informasjon, og når FB sesjon har utløpt, disse sidene bryte, kaste ut feil som Feil: sesjonsnøkkel Ugyldig eller ikke lenger gyldig.

Mitt spørsmål er om det er en måte å oppdatere brukerens Facebook-økt fra innenfor en iframe program for å holde den fra utløper en time senere. Har noen av de API-kall gjøre dette? Er det et Facebook Connect triks for å pinge noe? Er det noen definitive metode for å holde den i live? Jeg har ikke vært i stand til å finne noen eksempler som spesifikt adresserer dette.

Publisert på 07/05/2009 klokken 17:38
kilden bruker
På andre språk...                            


2 svar

stemmer
21

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.

Svarte 07/05/2009 kl. 23:32
kilden bruker

stemmer
2

bare sette

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

på toppen av siden din, og du vil ikke miste din økt i iframe.

Jeg la merke til at denne tråden er god to og et halvt år gammel. Jeg snublet over bruker Google. Kanskje mitt innlegg vil hjelpe noen andre som kommer over dette.

Svarte 28/01/2012 kl. 10:46
kilden bruker

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