Refreshing sesiune de Facebook dintr-o aplicație iframe

voturi
13

Am o aplicatie iframe Facebook, care este complet extern. Prin aceasta vreau să spun că, odată ce un utilizator accesează adresa URL panza pentru a încărca aplicația, toate link-urile din aplicația iframe merge la serverele mele, iar pagina panza nu se împrospătat decât dacă utilizatorul navighează în altă parte pe Facebook și se întoarce (sau face o reîmprospătare a browserului).

La încărcarea inițială a aplicației în cazul în care Facebook creează iframe, voi fi trecut de toți parametrii obișnuiți , cum ar fi fb_sig_user care - mi permite să creați o sesiune de aplicație internă bazată pe utilizator Facebook. Această sesiune de aplicație (care nu sesiunea Facebook, este propria mea sesiune app) este tot ce am nevoie pentru a permite utilizatorului să lucreze cu aplicația.

Problema vine o oră mai târziu. În cazul în care utilizatorul părăsește computerul, sau utilizează aplicația pentru mai mult de o oră, sesiunea Facebook expiră. Există unele pagini ale aplicației care necesită informații prieten preluare a, și o dată sesiunea de FB a expirat, aceste pagini rupe, aruncând erori, cum ar fi „Eroare: cheie de sesiune invalid sau nu mai sunt valabile“.

Întrebarea mea este dacă există o modalitate de a actualiza sesiune Facebook a utilizatorului dintr-o aplicație iframe să-l păstrați de la care expiră o oră mai târziu. Efectuați oricare dintre apelurile API face acest lucru? Există un truc Facebook Connect pentru a ping ceva? Există vreo metodă definitivă pentru ao menține în viață? N-am fost în stare să găsească exemple care se adresează în mod specific acest lucru.

Întrebat 07/05/2009 la 18:38
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
21

Victoria este a mea!

Există o caracteristică nedocumentate aproape în întregime pe Facebook de-a face cu sesiuni de iframe, pe care am găsit - o referire vagă la în cercetarea mea. Această pagină nu explica foarte bine cu toate acestea, și numai după câteva ore de vizionarea diferitelor chei de sesiune în iframe mea am fost în stare să dau seama ce se întâmplă.

Anterior, aplicația mea iframe a fost primit runda obișnuită a fb_whateverparametrilor , atunci când a avut loc sarcina inițială iframe. Deci , în cererea mea, am fost de a face acest lucru la fiecare cerere:

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'];

Acest cod ar primi fb_sig_session_keype sarcina aplicației inițiale și mi - ar veverita departe într - un local , $_SESSIONpentru a fi utilizat cu API - ul. Stocând - o în sesiunea locală este necesară, pentru că fb_sig_session_keyniciodată nu devine trecut din nou decât dacă reîncărcați întreaga iframe aplicației.

Deci, problemele au apărut atunci când această cheie de sesiune a expirat o oră mai târziu.

După ce se uită la pagina de referință vagă , am început examinarea toate $_REQUESTvariabilele am fost obtinerea. Se pare că , chiar și pe un link intern în interiorul aplicației iframe, Facebook modifică solicitarea de a trece de-a lungul unor parametri. Din anumite motive, ele au o cu totul diferită, dar , de asemenea , valabil cheie de sesiune , care vine împreună cu fiecare cerere iframe!

Acest parametru este numit după cheia API - ului Facebook Application. Deci , dacă cheia aplicației API este „xyz123“, fiecare cerere în interiorul iframe dvs. devine un parametru numit xyz123_session_key(precum și alte câteva, cum ar fi xyz123_expiresși xyz123_user).

După ce a urmărit timpul de expirare asociat pentru sesiunea principală (original fb_sig_session_key) și această sesiune numai iframe ( xyz123_session_key), lumina de la capătul tunelului a apărut: cheia de sesiune dată de expirare numai iframe de fapt , se actualizează ocazional . N - am determinat atunci când sau cum (presupun că este un ping Ajax la un moment dat), dar cu toate acestea, se împrospătează.

Am așteptat original fb_sig_session_keysesiunea să expire, și destul de sigur paginile legate de prieten în aplicația mea a început să scuipe erori. În acel moment, am schimbat cheia de sesiune stocată la nivel local la noul iframe-singura xyz123_session_key, iar problema a fost rezolvată. Această sesiune funcționează la fel de bine ca originalul!

Deci, codul meu fix final este de a stoca cheia de sesiune la nivel local, după cum urmează:

$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'];

Acest lucru dă prioritate tasta „numai iframe“.

Editare: presupunerea mea inițială că cheia „doar iframe“ a fost actualizat prin intermediul un fel de metodă Ajax a fost greșit, se pare că aceste valori sunt stabilite într - un cookie de Facebook. Acest lucru duce la unele probleme de eco-domeniu atunci când se utilizează aceste cookie - uri. Stabilirea unei politica cookie P3P va atenua acest lucru cu cele mai multe browsere, cu excepția Safari. Nu există încă nici o lucrare bună în jurul valorii de Safari.

Publicat 08/05/2009 la 00:32
sursa de către utilizator

voturi
2

Doar pune

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

pe partea de sus a paginii dvs. și nu veți pierde sesiunea din iframe.

Am făcut, de asemenea, observat că acest fir este de ani buni 2 și jumătate. Tocmai am dat peste utilizează Google. Poate meu post va ajuta pe altcineva care vine peste asta.

Publicat 28/01/2012 la 11:46
sursa de către utilizator

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