A győzelem az enyém!
Van egy szinte teljesen dokumentált Facebook jellemző foglalkozó iframe ülések, hogy találtam egy homályos utalást a kutatás. Ez az oldal nem igazán megmagyarázni jól azonban csak néhány óra elteltével figyeljük különböző munkamenetkulcsok én iframe voltam képes rájönni, hogy mi folyik itt.
Korábban én iframe app részesült a szokásos kerek a fb_whateverparaméter, ha a kezdeti iframe terhelés történt. Tehát az én alkalmazás, én ezt minden kéréssel:
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'];
Ez a kód kapna a fb_sig_session_keykezdeti app terhelést, és azt mókus el egy helyi $_SESSIONhasználata az API-t. Tárolja azt a helyi munkamenet van szükség, mert fb_sig_session_keysoha nem kerül át újra, hacsak újra az egész alkalmazás iframe.
Tehát a probléma merült fel, amikor ez a session kulcs lejárt egy órával később.
Miután megnézte a homályos utalás oldal , elkezdtem vizsgálja a $_REQUESTváltozók Kezdtem. Kiderült, hogy még egy belső linket belsejében iframe alkalmazás, Facebook módosítja a kérelem végigvezet néhány paraméter. Valamilyen oknál fogva, hogy van egy teljesen más, hanem érvényes session kulcsot, hogy jön minden iframe kérés
Ez a paraméter neve, mind a Facebook alkalmazás API kulcsot. Tehát, ha az alkalmazás API-kulcs „xyz123”, minden kérés belsejében iframe kap nevű paramétert xyz123_session_key(valamint néhány más, mint a xyz123_expiresés xyz123_user).
Miután megnézte a kapcsolódó lejárati idő a fő ülés (eredeti fb_sig_session_key), és ezt az iframe-csak ülés ( xyz123_session_key), a fényt az alagút végén megjelent: az iframe-only session kulcs lejárati idő valójában frissül időnként . Nem határozza meg, hogy mikor és hogyan (feltételezem, hogy ez egy Ajax ping bizonyos ponton), de mégis, ez felfrissíti.
Vártam az eredeti fb_sig_session_keymunkamenet lejár, és persze elég a barátja kapcsolatos oldalait app kezdett köhög fel hibákat. Ekkor váltottam én helyben tárolt session kulcsot az új iframe-csak xyz123_session_key, és a probléma megoldódott. Hogy a session is ugyanolyan jól működik, mint az eredeti!
Tehát a végső kód fix, hogy tárolja a session kulcsot helyileg az alábbiak szerint:
$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'];
Ez előnyben részesíti a „iframe-only” gombot.
Edit: Az eredeti feltételezést, hogy a „iframe-only” gomb frissítve keresztül valamilyen Ajax módszer rossz volt, akkor kiderül, ezek az értékek vannak beállítva a cookie-Facebookon. Ez néhány domainek probléma, ha ezek a cookie-kat. Beállítása P3P cookie-politika enyhíti ezt a legtöbb böngészővel, kivéve a Safari. Még mindig nem jó munka körül Safari.