Odświeżanie Facebook sesji z aplikacji iframe

głosy
13

Mam aplikacji iframe Facebook, która jest całkowicie zewnętrznych. Rozumiem przez to, że gdy użytkownik uzyskuje dostęp do URL kanwę do załadowania aplikacji, wszystkie linki w aplikacji iframe przejść do moich serwerów, a strona płótno nigdy nie zostanie odświeżony, chyba że użytkownik nawiguje do innego miejsca na Facebook i wraca (lub robi odświeżenia przeglądarki).

Na wstępnym obciążeniem aplikacji Facebook, gdzie tworzy iframe, to przejdzie wszystkie typowe parametry jak fb_sig_user która pozwala mi tworzyć wewnętrzną sesji aplikacji na podstawie użytkownika facebook. Ta aplikacja sesji (co jest nie sesja Facebook, to moja własna sesja app) ma wszystko, czego potrzebuję, aby umożliwić użytkownikowi pracę z aplikacją.

Problem zaczyna się godzinę później. Jeżeli użytkownik odchodzi od komputera, lub korzysta z aplikacji na więcej niż godzinę, sesja Facebook wygasa. Istnieje kilka stron aplikacji, które wymagają pobierania informacji przyjaciela, a po sesji FB wygasła, strony te pękają, wyrzucając błędy, takie jak „Błąd: nieprawidłowy klucz sesji lub nieważne”.

Moje pytanie brzmi, czy istnieje sposób, aby odświeżyć sesję Facebook użytkownika z poziomu aplikacji iframe, aby utrzymać go z upływającym godzinę później. Czy którykolwiek z API to zrobić? Czy jest jakiś trik Facebook Connect ping coś? Czy jest jakaś ostateczna metoda aby utrzymać go przy życiu? Nie byłem w stanie znaleźć żadnych przykładów, które specyficznie Ten adres.

Utwórz 07/05/2009 o 18:38
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
21

Zwycięstwo jest moje!

Jest prawie całkowicie nieudokumentowane Facebook cecha czynienia z sesjami iframe, że znalazłem niejasne odniesienie do moich badań. Ta strona nie naprawdę wyjaśnić to jednak dobrze, a dopiero po kilku godzinach oglądania różnych kluczy sesyjnych w moim iframe byłem w stanie dowiedzieć się, co się dzieje.

Wcześniej moja iframe app otrzymywał zwykle rundę fb_whateverparametrów, gdy wystąpił początkowy ładunek iframe. Tak w mojej aplikacji robię to na każde żądanie:

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

Kod ten otrzymałby fb_sig_session_keyod początkowego obciążenia aplikacji, a ja go wiewiórka z dala do lokalnego $_SESSIONdo użytku z API. Przechowywanie go w sesji lokalnej jest konieczne, ponieważ fb_sig_session_keynigdy nie zostanie przekazany ponownie, chyba że odświeżyć całą aplikacji iframe.

Więc problemy wystąpiły przy tym klucz sesji upłynął godzina albo tak później.

Po zapoznaniu się z niejasnym stronie odniesienia , zacząłem badając wszystkie $_REQUESTzmienne ja trafiałem. Okazuje się, że nawet na wewnętrznym linku wewnątrz aplikacji iframe Facebook modyfikuje wniosek przejść wzdłuż niektórych parametrów. Z jakiegoś powodu, mają zupełnie inny, ale także ważny klucz sesji, która przychodzi wraz z każdym żądaniem iframe!

Parametr ten jest nazwany po klucz API Facebook Application. Więc jeśli twój klucz API jest aplikacja „xyz123”, każda prośba wewnątrz iframe pobiera parametr zwany xyz123_session_key(a także kilka innych, jak xyz123_expiresi xyz123_user).

Po obejrzeniu czasu wygaśnięcia zrzeszonych do głównej sesji (oryginał fb_sig_session_key), a tym iframe tylko sesji ( xyz123_session_key), światło na końcu tunelu pojawiło: klucz sesji czas wygaśnięcia iframe tylko faktycznie jest aktualizowany od czasu do czasu . Nie określa się, kiedy i jak (zakładam, że jest to ping Ajax w pewnym momencie), ale mimo wszystko to odświeża.

Czekałem na oryginalnej fb_sig_session_keysesji wygaśnie, a na pewno wystarczy do stron związanych z przyjacielem w mojej aplikacji rozpoczął odkrztuszanie błędów. W tym momencie zmieniłem moje lokalnie przechowywany klucz sesji do nowego iframe-only xyz123_session_key, a problem został rozwiązany. Że sesja działa tak samo dobrze jak oryginał!

Tak, mój kod końcowy fix jest przechowywać lokalnie klucza sesji w następujący sposób:

$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 daje pierwszeństwo do klucza „tylko” iframe.

Edit: Mój oryginalny założenie, że kluczem „iframe-only” została zaktualizowana poprzez pewnego rodzaju metody Ajax mylił, okazuje się, że te wartości są ustawione w pliku cookie przez Facebook. To prowadzi do pewnych problemów między domenami przy użyciu tych plików cookie. Ustawianie Cookie Policy P3P będzie złagodzić ten z większością przeglądarek, z wyjątkiem Safari. Nadal nie ma dobrą pracę wokół dla Safari.

Odpowiedział 08/05/2009 o 00:32
źródło użytkownik

głosy
2

Po prostu włóż

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

na górze strony, a nie stracisz sesji w iframe.

Ja również zauważyłem, że ten wątek jest dobry 2 i pół lat. Właśnie natknął się za pomocą Google. Może mój post pomoże komuś, kto natknie to.

Odpowiedział 28/01/2012 o 11:46
źródło użytkownik

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