Menyegarkan sesi Facebook dari aplikasi iframe

Saya punya aplikasi iframe Facebook yang sepenuhnya eksternal. Maksud saya, setelah pengguna mengakses URL kanvas untuk memuat aplikasi, semua tautan di aplikasi iframe masuk ke server saya, dan halaman kanvas tidak pernah disegarkan kecuali pengguna menavigasi ke tempat lain di Facebook dan kembali (atau apakah browser menyegarkan).

Pada pemuatan awal aplikasi tempat Facebook membuat iframe, saya melewati semua parameter biasa seperti fb_sig_user yang memungkinkan saya membuat sesi aplikasi internal berdasarkan pengguna facebook. Sesi aplikasi ini (yang bukan sesi Facebook, ini adalah sesi aplikasi saya sendiri) adalah semua yang saya perlukan agar pengguna dapat bekerja dengan aplikasi tersebut.

Masalahnya muncul satu jam kemudian. Jika pengguna meninggalkan komputer, atau menggunakan aplikasi selama lebih dari satu jam, sesi Facebook akan berakhir. Ada beberapa halaman aplikasi yang memerlukan pengambilan informasi teman, dan setelah sesi FB berakhir, halaman ini rusak, memunculkan kesalahan seperti "Kesalahan: Kunci sesi tidak valid atau tidak lagi valid".

Pertanyaan saya adalah apakah ada cara untuk menyegarkan sesi Facebook pengguna dari dalam aplikasi iframe agar tidak kedaluwarsa satu jam kemudian. Apakah ada panggilan API yang melakukan hal ini? Apakah ada trik Facebook Connect untuk melakukan ping ke sesuatu? Apakah ada metode pasti untuk menjaganya tetap hidup? Saya belum dapat menemukan contoh yang secara khusus membahas hal ini.


person zombat    schedule 07.05.2009    source sumber


Jawaban (2)


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
comment
Sepertinya metode ini menggunakan cookie, sehingga Safari mengalami kesulitan karena cookie bersifat lintas domain. - person zombat; 16.05.2009
comment
Nah, melalui Ajax Anda bisa menyimpan (di halaman pertama) dan mengambilnya dari DB di semua halaman berikut - jika saya mendapatkan solusi yang benar. Tentunya harus disimpan dengan user id fb sebagai keynya, tapi ini harusnya tetap bisa didapat atau? Karena masalah cookie lintasdomain, saya menyelesaikan hampir semuanya melalui Database dan Ajax. Bagaimanapun, jempol untuk penyelidikan Anda dalam masalah ini, itulah informasi yang saya cari :-) - person SamiSalami; 30.08.2012
comment
Tampaknya Anda mungkin tidak bisa mendapatkan userId lagi, jika sesi telah kedaluwarsa, jadi mungkin Anda bisa menggunakan cara lama dan memposting input tersembunyi melalui aplikasi Anda... solusi yang jelek pastinya, tetapi harusnya berhasil dan saya akan mencoba untuk pergi dengan yang itu. - person SamiSalami; 30.08.2012

Taruh saja

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

di atas halaman Anda dan Anda tidak akan kehilangan sesi di iframe.

Saya juga memperhatikan bahwa thread ini berumur 2 setengah tahun. Saya baru saja menemukan menggunakan Google. Mungkin postingan saya akan membantu orang lain yang mengalami hal ini.

person Jan K.    schedule 28.01.2012
comment
Ini adalah solusi yang hanya digunakan untuk IE, yang selalu kehilangan sesi FB, tetapi ini tidak ada hubungannya dengan berakhirnya sesi setelah satu jam - ini akan selalu terjadi, FB membiarkannya kedaluwarsa. Juga untuk mengatasi masalah IE Anda harus menggunakan header lengkap ini: header('P3P:CP=IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'); - person SamiSalami; 30.08.2012