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.