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.