Osvěžující Facebook relace z aplikace iframe

hlasů
13

Mám iframe aplikace Facebook, která je zcela vnější. Tím mám na mysli, že jakmile uživatel přistupuje plátěnou URL k načtení aplikace, všechny odkazy v aplikaci iframe jít do mé servery, a stránka plátno nikdy nedostane obnovovat, pokud uživatel dostane někam jinam na Facebooku a vrátí (nebo dělá obnovení prohlížeče).

Na počáteční zatížení aplikace, kde Facebook vytváří iframe, jsem si prošel všechny obvyklé parametry, jako fb_sig_user který mi umožňuje vytvořit vnitřní relace aplikace založené na uživatele Facebooku. Tato aplikace (Session, která je ne Facebook Když relace, je to moje vlastní app sezení) je vše, co je potřeba umožnit uživateli pracovat s aplikací.

Problém nastává, o hodinu později. V případě, že uživatel opustí počítač, nebo používá aplikace pro více než hodinu, relace Facebook zaniká. Tam jsou některé aplikace stránky, které vyžadují načítání informací přítel, a jakmile FB sezení vypršelo, tyto stránky zlomit, házení chyby, jako například „Error: klíč relace neplatné nebo již není platné“.

Moje otázka zní, zda existuje způsob, jak obnovit uživatele Facebooku relace z aplikace iframe, aby jej z vyprší o hodinu později. Proveďte některý z volání API to udělat? Je tam nějaký trik Facebook Connect ping něco? Je nějaká definitivní způsob, jak udržet při životě? Nebyl jsem schopen najít nějaké příklady, které se specificky zaměřují na to.

Položena 07/05/2009 v 18:38
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
21

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.

Odpovězeno 08/05/2009 v 00:32
zdroj uživatelem

hlasů
2

stačí dát

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

Na horní části stránky a nebudete ztrácet svoji relaci v iframe.

Také jsem si všiml, že toto vlákno je dobrá 2 a půl let. Jen jsem narazil se pomocí Google. Možná, že můj příspěvek pomůže někoho jiného, ​​kdo narazí toto.

Odpovězeno 28/01/2012 v 11:46
zdroj uživatelem

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