Kemenangan adalah milikku!
Ada fitur Facebook yang hampir seluruhnya tidak terdokumentasi yang berhubungan dengan sesi iframe, yang saya temukan referensi yang tidak jelas dalam penelitian saya. Namun halaman ini tidak menjelaskannya dengan baik, dan hanya setelah beberapa jam mengamati berbagai kunci sesi di iframe saya barulah saya dapat mengetahui apa yang sedang terjadi.
Sebelumnya, aplikasi iframe saya menerima putaran parameter fb_whatever
seperti biasa saat pemuatan iframe awal terjadi. Jadi dalam aplikasi saya, saya melakukan ini pada setiap permintaan:
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'];
Kode ini akan menerima fb_sig_session_key
pada pemuatan aplikasi awal, dan saya akan memindahkannya ke $_SESSION
lokal untuk digunakan dengan API. Menyimpannya di sesi lokal diperlukan, karena fb_sig_session_key
tidak akan diteruskan lagi kecuali Anda memuat ulang seluruh iframe aplikasi.
Jadi masalah terjadi ketika kunci sesi ini kedaluwarsa sekitar satu jam kemudian.
Setelah melihat halaman referensi yang tidak jelas, saya mulai memeriksa semua $_REQUEST
variabel yang saya miliki sedang mendapatkan. Ternyata bahkan pada tautan internal di dalam aplikasi iframe Anda, Facebook mengubah permintaan untuk meneruskan beberapa parameter. Karena alasan tertentu, mereka memiliki kunci sesi yang benar-benar berbeda, namun juga valid yang menyertai setiap permintaan iframe!
Parameter ini diberi nama sesuai kunci api Aplikasi Facebook Anda. Jadi, jika kunci API aplikasi Anda adalah "xyz123", setiap permintaan di dalam iframe Anda mendapat parameter bernama xyz123_session_key
(serta beberapa permintaan lainnya, seperti xyz123_expires
dan xyz123_user
).
Setelah melihat waktu kedaluwarsa yang terkait untuk sesi utama (fb_sig_session_key
asli) dan sesi khusus iframe ini (xyz123_session_key
), lampu di ujung terowongan muncul: waktu kedaluwarsa kunci sesi khusus iframe kadang-kadang diperbarui . Saya belum menentukan kapan atau bagaimana (saya berasumsi ini adalah ping Ajax di beberapa titik), namun tetap saja, ini menyegarkan.
Saya menunggu hingga sesi fb_sig_session_key
asli berakhir, dan benar saja, laman terkait teman di aplikasi saya mulai memunculkan kesalahan. Pada saat itu, saya mengalihkan kunci sesi yang disimpan secara lokal ke xyz123_session_key
khusus iframe baru, dan masalahnya terpecahkan. Sesi itu berfungsi sama baiknya dengan aslinya!
Jadi, perbaikan kode terakhir saya adalah menyimpan kunci sesi secara lokal sebagai berikut:
$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'];
Ini memberikan preferensi pada kunci "iframe saja".
Sunting: Asumsi awal saya bahwa kunci "iframe-only" diperbarui melalui semacam metode Ajax adalah salah, ternyata nilai-nilai ini disetel ke dalam cookie oleh Facebook. Hal ini menyebabkan beberapa masalah lintas domain saat menggunakan cookie ini. Menyetel P3P kebijakan cookie akan mengatasi masalah ini pada sebagian besar browser, kecuali Safari. Masih belum ada solusi yang baik untuk Safari.
person
zombat
schedule
07.05.2009