ชัยชนะเป็นของฉัน!
มีฟีเจอร์ 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