2009-05-07 12 views
13

मेरे पास एक फेसबुक आईफ्रेम एप्लिकेशन है जो पूरी तरह से बाहरी है। इसका मतलब है कि जब उपयोगकर्ता एप्लिकेशन लोड करने के लिए कैनवास यूआरएल तक पहुंच जाता है, तो आईफ्रेम ऐप में सभी लिंक मेरे सर्वर पर जाते हैं, और कैनवास पेज कभी भी ताज़ा नहीं होता है जब तक कि उपयोगकर्ता फेसबुक पर कहीं और नज़र रखता है और वापस आता है (या क्या ब्राउज़र रीफ्रेश करता है)।एक आईफ्रेम एप्लिकेशन से रीफ्रेशिंग फेसबुक सत्र

ऐप के शुरुआती लोड पर जहां फेसबुक आईफ्रेम बनाता है, तो मुझे fb_sig_user जैसे सभी सामान्य पैरामीटर पारित होते हैं जो मुझे फेसबुक उपयोगकर्ता के आधार पर एक आंतरिक ऐप सत्र बनाने की अनुमति देता है। यह ऐप सत्र (जो फेसबुक सत्र नहीं है, यह मेरा स्वयं का ऐप सत्र है) मुझे उपयोगकर्ता को ऐप के साथ काम करने की अनुमति देने की ज़रूरत है।

समस्या एक घंटे बाद आती है। यदि उपयोगकर्ता कंप्यूटर छोड़ देता है, या एक घंटे से अधिक समय तक ऐप का उपयोग करता है, तो फेसबुक सत्र समाप्त हो जाता है। ऐसे कुछ ऐप पेज हैं जिन्हें मित्र जानकारी प्राप्त करने की आवश्यकता होती है, और एक बार एफबी सत्र समाप्त हो जाने के बाद, ये पृष्ठ तोड़ते हैं, "त्रुटि: सत्र कुंजी अमान्य या मान्य नहीं है" जैसी त्रुटियां फेंकती हैं।

मेरा सवाल यह है कि उपयोगकर्ता के फेसबुक सत्र को एक घंटे बाद समाप्त होने से रोकने के लिए उपयोगकर्ता के फेसबुक सत्र को रीफ्रेश करने का कोई तरीका है या नहीं। क्या एपीआई कॉल में से कोई ऐसा करता है? क्या कुछ पिंग करने के लिए एक फेसबुक कनेक्ट चाल है? क्या इसे जीवित रखने के लिए कोई निश्चित तरीका है? मैं ऐसे उदाहरण ढूंढने में सक्षम नहीं हूं जो विशेष रूप से इसे संबोधित करते हैं।

उत्तर

21

विजय मेरा है!

iframe के सत्र के साथ काम कर एक लगभग पूर्ण undocumented फेसबुक सुविधा, कि मैं अपने अनुसंधान के क्षेत्र में एक vague reference to पाया जाता है। यह पृष्ठ वास्तव में इसे अच्छी तरह से समझा नहींता है, और मेरे आईफ्रेम में विभिन्न सत्र कुंजी देखने के कई घंटों के बाद ही मैं यह पता लगाने में सक्षम था कि क्या हो रहा था।

पहले, मेरा आईफ्रेम ऐप प्रारंभिक iframe लोड होने पर fb_whatever पैरामीटर के सामान्य दौर को प्राप्त कर रहा था। तो अपने आवेदन में, मैं हर अनुरोध पर इस कर रहा था:

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 प्राप्त होगा, और मैं इसे दूर API के साथ उपयोग के लिए गिलहरी हैं एक स्थानीय $_SESSION में। स्थानीय सत्र में इसे संग्रहीत करना जरूरी है, क्योंकि fb_sig_session_key तब तक कभी नहीं पारित हो जाता है जब तक कि आप संपूर्ण ऐप iframe को फिर से लोड न करें।

तो समस्याएं तब हुई जब इस सत्र कुंजी को एक घंटे या उससे भी अधिक समय समाप्त हो गया।

vague reference page को देखने के बाद, मैंने सभी $_REQUEST वेरिएबल्स की जांच शुरू कर दी। यह पता चला है कि आपके आईफ्रेम ऐप के अंदर एक आंतरिक लिंक पर भी, फेसबुक कुछ मानकों के साथ पास करने के अनुरोध को संशोधित करता है। किसी कारण से, उनके पास पूरी तरह से अलग है, लेकिन यह भी सत्र कुंजी मान्य है जो प्रत्येक आईफ्रेम अनुरोध के साथ आता है!

इस पैरामीटर का नाम आपके फेसबुक एप्लिकेशन एपीआई कुंजी के नाम पर रखा गया है। इसलिए यदि आपकी एप्लिकेशन एपीआई कुंजी "xyz123" है, तो आपके आईफ्रेम के अंदर प्रत्येक अनुरोध को xyz123_session_key (साथ ही कुछ अन्य, जैसे xyz123_expires और xyz123_user) नामक पैरामीटर प्राप्त होता है।

मुख्य सत्र (मूल fb_sig_session_key) और इस iframe-केवल सत्र (xyz123_session_key) के लिए जुड़े समाप्ति समय देखने के बाद, सुरंग के अंत में प्रकाश दिखाई दिया: iframe-केवल सत्र कुंजी समाप्ति समय वास्तव में हो जाता है कभी-कभी अपडेट किया गया। मैंने यह निर्धारित नहीं किया है कि कब या कैसे (मुझे लगता है कि यह किसी बिंदु पर एक अजाक्स पिंग है), लेकिन फिर भी, यह ताज़ा हो जाता है।

मैं समाप्त होने के लिए मूल fb_sig_session_key सत्र का इंतजार कर रहा था, और सुनिश्चित करें कि मेरे ऐप में मित्र-संबंधित पृष्ठों ने त्रुटियों को खांसी शुरू कर दी है। उस बिंदु पर, मैंने अपनी स्थानीय रूप से संग्रहीत सत्र कुंजी को नए आईफ्रेम-केवल 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" कुंजी किसी प्रकार की अजाक्स विधि के माध्यम से अपडेट की गई थी, यह पता चला कि ये मान फेसबुक द्वारा कुकी में सेट किए गए हैं। इन कुकीज़ का उपयोग करते समय इससे कुछ क्रॉस-डोमेन समस्याएं होती हैं। P3P cookie policy सेट करना सफारी को छोड़कर, अधिकांश ब्राउज़रों के साथ इसे कम करेगा। सफारी के लिए अभी भी कोई अच्छा काम नहीं है।

+0

ऐसा लगता है कि यह विधि कुकीज़ का उपयोग करती है, इसलिए सफारी को इसके साथ कुछ कठिनाई है, क्योंकि कुकीज़ क्रॉस-डोमेन हैं। – zombat

+0

ठीक है, अजाक्स के माध्यम से आप केवल निम्नलिखित पृष्ठों पर सहेज सकते हैं और इसे निम्नलिखित सभी पृष्ठों पर डीबी से पुनर्प्राप्त कर सकते हैं - अगर मुझे आपका समाधान सही लगता है। बेशक इसे एफबी उपयोगकर्ता आईडी के साथ कुंजी के रूप में सहेजना होगा, लेकिन यह अभी भी प्राप्त करने में सक्षम होना चाहिए या? क्रॉसडोमेन कुकी समस्या के कारण, मैं डेटाबेस और अजाक्स के माध्यम से लगभग हर चीज को हल कर रहा हूं। वैसे भी इस मामले में आपकी जांच के लिए अंगूठे, यह वह जानकारी है जिसे मैं ढूंढ रहा हूं :-) – SamiSalami

+0

ऐसा लगता है कि यदि आप सत्र समाप्त हो गए हैं, तो शायद आप उपयोगकर्ता को प्राप्त नहीं कर पाएंगे, तो शायद आप पुराने फैशन का उपयोग कर सकें अपने ऐप के माध्यम से छुपा इनपुट में रास्ता और पोस्ट ... निश्चित रूप से बदसूरत समाधान, लेकिन काम करना चाहिए और मैं उस के साथ जाने की कोशिश करूंगा। – SamiSalami

2

बस अपने पेज के शीर्ष पर

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

डाल दिया और आप iframe में अपने सत्र नहीं खोएंगे।

मैंने यह भी नोटिस किया कि यह धागा साढ़े पांच साल पुराना है। मैंने बस Google का उपयोग कर ठोकर खाई है। हो सकता है कि मेरी पोस्ट किसी और की मदद करेगी जो इस पर आती है।

+0

यह केवल एक समाधान है जो केवल आईई के लिए उपयोग किया जाता है, जो हमेशा एफबी सत्र खो देता है, लेकिन सत्र के समाप्ति के साथ इसका कोई समय नहीं होता है - यह हमेशा मामला होगा, एफबी इसे समाप्त करने देता है। आईई समस्या को हल करने के लिए आपको इस पूर्ण शीर्षलेख का उपयोग करना चाहिए: हेडर ('पी 3 पी: सीपी = "आईडीसी डीएसपी सीओआर एडीएम देवी ताइई पीएसए PSD आईवीएआई आईवीडीआई कोंआई उनका हमारा भारतीय सीएनटी"'); – SamiSalami

संबंधित मुद्दे