Vítězství je moje!
Tam je téměř zcela bez dokladů funkce Facebook zabývá relací iframe, který jsem našel vágní odkaz v mém výzkumu. Tato stránka není opravdu vysvětlit to dobře nicméně, a teprve po několika hodinách sledování různých klíčů relace v mém iframe jsem byl schopen přijít na to, co se děje.
Dříve jsem iframe app přijímal obvyklou kolo fb_whateverparametrů, kdy došlo k počáteční zatížení iframe. Takže v mé žádosti, jsem dělal to o každé žádosti:
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'];
Tento kód by se dostávají fb_sig_session_keyna počáteční zatížení aplikací, a já bych se veverka pryč do místní $_SESSIONpro použití s API. Uložením do místní relace je nutné, protože fb_sig_session_keynikdy nedostane prošel znovu, pokud si znovu celou aplikaci iframe.
Tak došlo k problémům, když tento klíč relace skončila tak hodinu později.
Poté, co při pohledu na vágní referenční stránky , jsem začal zkoumat všechny $_REQUESTproměnné jsem začínal. Ukazuje se, že i na vnitřní linku uvnitř vašeho iframe aplikaci Facebook upravuje žádost předat některé parametry. Z nějakého důvodu, že mají zcela odlišný, ale také platný klíč relace, který je dodáván spolu s každým požadavkem iframe!
Tento parametr je pojmenován po vašem api klíče Facebook aplikací. Takže pokud váš klíč aplikace API je „xyz123“, každý požadavek uvnitř iframe dostane parametr s názvem xyz123_session_key(stejně jako několik dalších, jako jsou xyz123_expiresa xyz123_user).
Po zhlédnutí spojenou čas vypršení platnosti pro hlavní sezení (originál fb_sig_session_key) a tento iframe pouze relace ( xyz123_session_key), světlo na konci tunelu objevilo: iframe jen klíč relace Doba použitelnosti se skutečně dostane občas aktualizovány . Nemám stanoveno, kdy a jak (předpokládám, že je to Ajax ping na nějakém místě), nicméně, to osvěží.
Čekal jsem na původní fb_sig_session_keyrelace vyprší, a opravdu stránky s přáteli souvisejících v mém app začal vykašlávání chyby. Na tom místě, přešel jsem lokálně uložené klíče relace na nový iframe-only xyz123_session_key, a problém byl vyřešen. Že relace funguje stejně dobře jako originál!
Takže můj poslední kód oprava je pro uložení klíče relace na místě takto:
$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'];
To dává přednost k „iframe-only“ klíč.
Edit: Má původní předpoklad, že „iframe jen“ klíč byl aktualizován pomocí jakéhosi způsobu Ajax bylo špatné, to dopadá tyto hodnoty jsou nastaveny do cookie ze strany Facebooku. To vede k některým problémům s doménami při použití těchto cookies. Nastavení cookie politiku P3P zmírní to s většinou prohlížečů, s výjimkou Safari. Stále neexistuje dobrá práce kolem Safari.