กำลังรีเฟรชเซสชัน Facebook จากแอปพลิเคชัน iframe

ฉันมีแอปพลิเคชัน Facebook iframe ที่เป็นภายนอกทั้งหมด โดยสิ่งนี้ ฉันหมายความว่าเมื่อผู้ใช้เข้าถึง URL แคนวาสเพื่อโหลดแอปพลิเคชัน ลิงก์ทั้งหมดในแอป iframe จะไปที่เซิร์ฟเวอร์ของฉัน และหน้าแคนวาสจะไม่ได้รับการรีเฟรช เว้นแต่ผู้ใช้จะนำทางไปยังที่อื่นบน Facebook และกลับมา (หรือ รีเฟรชเบราว์เซอร์)

ในการโหลดครั้งแรกของแอปที่ Facebook สร้าง iframe ฉันจะถูกส่งผ่านพารามิเตอร์ปกติทั้งหมด เช่น fb_sig_user ซึ่งทำให้ฉันสามารถสร้างเซสชันแอปภายในตามผู้ใช้ Facebook ได้ เซสชันของแอปนี้ (ซึ่ง ไม่ใช่ เซสชันของ Facebook แต่เป็นเซสชันของแอปของฉันเอง) คือทั้งหมดที่ฉันต้องการเพื่อให้ผู้ใช้สามารถทำงานกับแอปได้

ปัญหามาหนึ่งชั่วโมงต่อมา หากผู้ใช้ออกจากคอมพิวเตอร์หรือใช้แอพนานกว่าหนึ่งชั่วโมง เซสชั่นของ Facebook จะหมดอายุ มีหน้าแอพบางหน้าที่ต้องดึงข้อมูลเพื่อน และเมื่อเซสชั่น FB หมดอายุ หน้าเหล่านี้จะพัง ทำให้เกิดข้อผิดพลาด เช่น "ข้อผิดพลาด: คีย์เซสชั่นไม่ถูกต้องหรือไม่ถูกต้องอีกต่อไป"

คำถามของฉันคือมีวิธีรีเฟรชเซสชัน Facebook ของผู้ใช้จากภายในแอปพลิเคชัน iframe เพื่อไม่ให้เซสชันหมดอายุในหนึ่งชั่วโมงต่อมาหรือไม่ การเรียก API ใด ๆ ทำเช่นนี้หรือไม่ มีเคล็ดลับ Facebook Connect เพื่อ ping บางอย่างหรือไม่? มีวิธีการใดที่จะรักษาชีวิตให้คงอยู่ได้ในที่สุด? ฉันไม่พบตัวอย่างใด ๆ ที่กล่าวถึงเรื่องนี้โดยเฉพาะ


person zombat    schedule 07.05.2009    source แหล่งที่มา


คำตอบ (2)


ชัยชนะเป็นของฉัน!

มีฟีเจอร์ Facebook ที่ไม่มีเอกสารเกือบทั้งหมดที่เกี่ยวข้องกับเซสชัน iframe ซึ่งฉันพบ การอ้างอิงที่คลุมเครือถึง ในการวิจัยของฉัน อย่างไรก็ตาม หน้านี้อธิบายได้ไม่ดีนัก และหลังจากดูเซสชันคีย์ต่างๆ ใน ​​iframe เป็นเวลาหลายชั่วโมงเท่านั้น ฉันจึงทราบได้ว่าเกิดอะไรขึ้น

ก่อนหน้านี้ แอป iframe ของฉันได้รับพารามิเตอร์ fb_whatever รอบปกติเมื่อโหลด iframe เริ่มต้น ดังนั้นในใบสมัครของฉัน ฉันทำสิ่งนี้กับทุกคำขอ:

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

โค้ดนี้จะได้รับ fb_sig_session_key ในการโหลดแอปครั้งแรก และฉันจะแยกมันออกไปใน $_SESSION ในเครื่องเพื่อใช้กับ API จำเป็นต้องจัดเก็บข้อมูลไว้ในเซสชันในเครื่อง เนื่องจาก fb_sig_session_key จะไม่ถูกส่งต่อไปอีก เว้นแต่คุณจะโหลด iframe ของแอปทั้งหมดอีกครั้ง

ดังนั้นปัญหาจึงเกิดขึ้นเมื่อคีย์เซสชันนี้หมดอายุภายในหนึ่งชั่วโมงหรือหลังจากนั้น

หลังจากดูที่หน้าอ้างอิงที่คลุมเครือ ฉันก็เริ่มตรวจสอบตัวแปร $_REQUEST ทั้งหมดที่ฉัน กำลังได้รับ ปรากฎว่าแม้ในลิงก์ภายในภายในแอป iframe ของคุณ Facebook ก็ยังแก้ไขคำขอเพื่อส่งผ่านพารามิเตอร์บางตัว ด้วยเหตุผลบางประการ พวกเขามีคีย์เซสชัน แตกต่างทั้งหมด แต่ยังใช้ได้ ที่มาพร้อมกับคำขอ iframe ทุกรายการ!

พารามิเตอร์นี้ตั้งชื่อตามคีย์ API ของแอปพลิเคชัน Facebook ของคุณ ดังนั้น หากคีย์ API แอปพลิเคชันของคุณคือ "xyz123" ทุกคำขอภายใน iframe ของคุณจะได้รับพารามิเตอร์ชื่อ xyz123_session_key (รวมถึงคำขออื่นๆ อีกสองสามรายการ เช่น xyz123_expires และ xyz123_user)

หลังจากดูเวลาหมดอายุที่เกี่ยวข้องสำหรับเซสชันหลัก (ดั้งเดิม fb_sig_session_key) และเซสชันเฉพาะ iframe นี้ (xyz123_session_key) ไฟที่ปลายอุโมงค์ปรากฏขึ้น: เวลาหมดอายุของคีย์เซสชันเฉพาะ iframe เท่านั้นได้รับการอัปเดตจริง ๆ เป็นครั้งคราว . ฉันไม่ได้กำหนดเวลาหรืออย่างไร (ฉันคิดว่ามันเป็น Ajax ping ในบางจุด) แต่ถึงกระนั้นมันก็รีเฟรช

ฉันรอให้เซสชัน fb_sig_session_key เดิมหมดอายุ และหน้าที่เกี่ยวข้องกับเพื่อนในแอปของฉันเริ่มแสดงข้อผิดพลาดมากพอแล้ว ณ จุดนั้น ฉันเปลี่ยนเซสชันคีย์ที่จัดเก็บไว้ในเครื่องเป็น iframe-only xyz123_session_key ใหม่ และปัญหาได้รับการแก้ไขแล้ว เซสชันนั้นใช้งานได้ดีเหมือนเดิม!

ดังนั้น การแก้ไขโค้ดขั้นสุดท้ายของฉันคือการจัดเก็บคีย์เซสชันไว้ในเครื่องดังนี้:

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

สิ่งนี้ให้การตั้งค่าคีย์ "iframe-only"

แก้ไข: สมมติฐานดั้งเดิมของฉันที่ว่าคีย์ "iframe เท่านั้น" ได้รับการอัปเดตด้วยวิธี Ajax บางประเภทนั้นผิด ปรากฎว่าค่าเหล่านี้ถูกตั้งค่าไว้ในคุกกี้โดย Facebook สิ่งนี้นำไปสู่ปัญหาข้ามโดเมนเมื่อใช้คุกกี้เหล่านี้ การตั้งค่า P3P นโยบายคุกกี้จะบรรเทาปัญหานี้กับเบราว์เซอร์ส่วนใหญ่ ยกเว้น Safari ยังไม่มีวิธีแก้ไขที่ดีสำหรับ Safari

person zombat    schedule 07.05.2009
comment
ดูเหมือนว่าวิธีนี้จะใช้คุกกี้ ดังนั้น Safari จึงมีปัญหาอยู่บ้าง เนื่องจากคุกกี้เป็นแบบข้ามโดเมน - person zombat; 16.05.2009
comment
ด้วย Ajax คุณสามารถบันทึก (ที่หน้าแรก) และดึงข้อมูลจากฐานข้อมูลในหน้าต่อไปนี้ทั้งหมด - ถ้าฉันแก้ไขปัญหาได้ถูกต้อง แน่นอนว่าจะต้องบันทึกโดยมีรหัสผู้ใช้ fb เป็นคีย์ แต่ควรจะยังได้รับหรือไม่ เนื่องจากปัญหาคุกกี้ข้ามโดเมน ฉันจึงแก้ไขเกือบทุกอย่างผ่านฐานข้อมูลและ Ajax ยังไงก็ตาม ยกนิ้วให้กับการสืบสวนของคุณในเรื่องนี้ มันเป็นข้อมูลที่ฉันกำลังมองหา :-) - person SamiSalami; 30.08.2012
comment
ดูเหมือนว่าคุณอาจไม่สามารถรับรหัสผู้ใช้ได้อีกต่อไป หากเซสชันหมดอายุ ดังนั้นบางทีคุณอาจใช้วิธีเดิมๆ และโพสต์ในอินพุตที่ซ่อนอยู่ผ่านแอปของคุณ... วิธีแก้ปัญหาที่น่าเกลียดอย่างแน่นอน แต่ควรจะได้ผลและฉัน จะพยายามไปกับอันนั้น - person SamiSalami; 30.08.2012

เพียงแค่ใส่

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

ที่ด้านบนของหน้า และคุณจะไม่สูญเสียเซสชันใน iframe

ฉันยังสังเกตเห็นด้วยว่ากระทู้นี้มีอายุ 2 ปีครึ่งที่ดี เพิ่งรู้ว่าใช้ Google บางทีโพสต์ของฉันอาจช่วยคนอื่นที่เจอสิ่งนี้

person Jan K.    schedule 28.01.2012
comment
เป็นวิธีแก้ปัญหาที่ใช้เฉพาะกับ IE ซึ่งจะทำให้เซสชัน FB หายไปเสมอ แต่สิ่งนี้ไม่เกี่ยวอะไรกับการหมดอายุของเซสชันหลังจากผ่านไปหนึ่งชั่วโมง - จะเป็นเช่นนี้เสมอ FB ปล่อยให้เซสชันนั้นหมดอายุ นอกจากนี้ เพื่อแก้ไขปัญหา IE คุณควรใช้ส่วนหัวที่สมบูรณ์นี้: header('P3P:CP=IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'); - person SamiSalami; 30.08.2012