Η νίκη είναι δική μου!
Υπάρχει μια σχεδόν εξ ολοκλήρου χωρίς χαρτιά λειτουργία του Facebook που ασχολούνται με συνεδρίες iframe, που βρήκα μια αόριστη αναφορά στην έρευνά μου. Αυτή η σελίδα δεν είναι πραγματικά το εξηγήσω καλά όμως, και μόνο μετά από αρκετές ώρες παρακολουθώντας διάφορα πλήκτρα συνεδρία στο iframe μου ήμουν σε θέση να καταλάβω τι συνέβαινε.
Προηγουμένως, iframe app μου έπαιρνε το συνηθισμένο γύρο των 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στο αρχικό φορτίο app, και θα ήθελα να σκίουρος μακριά σε ένα τοπικό $_SESSIONγια χρήση με το API. Αποθήκευσή του στην τοπική σύνοδο είναι απαραίτητη, γιατί fb_sig_session_keyποτέ δεν παίρνει πέρασε ξανά εκτός αν φορτώσετε εκ νέου το σύνολο της iframe εφαρμογή.
Έτσι, τα προβλήματα εμφανίστηκαν όταν αυτό το κλειδί συνόδου λήξει μια ώρα περίπου αργότερα.
Μετά την εξέταση των αόριστη σελίδα αναφοράς , άρχισα να εξετάζει όλες τις $_REQUESTμεταβλητές που έπαιρνα. Αποδεικνύεται ότι, ακόμη και σε μια εσωτερική σύνδεση μέσα στο iframe εφαρμογή σας, το Facebook τροποποιεί το αίτημα να περάσουν μαζί κάποιες παραμέτρους. Για κάποιο λόγο, έχουν μια εντελώς διαφορετική, αλλά και έγκυρο κλειδί συνόδου που έρχεται μαζί με κάθε αίτηση iframe!
Αυτή η παράμετρος είναι το όνομά του από το κλειδί API Facebook Application σας. Έτσι, αν το κλειδί API εφαρμογή σας είναι «XYZ123», κάθε αίτηση μέσα στο iframe σας παίρνει μια παράμετρο που ονομάζεται xyz123_session_key(καθώς και μερικά άλλα, όπως xyz123_expiresκαι η xyz123_user).
Μετά βλέποντας το σχετικό χρόνο λήξης για την κύρια συνεδρία (η αρχική fb_sig_session_key) και αυτό το iframe μόνο συνεδρία ( xyz123_session_key), το φως στην άκρη του τούνελ φάνηκε: το iframe μόνο κλειδί συνόδου χρόνο λήξης πραγματικότητα ενημερώνεται κατά καιρούς . Δεν έχω προσδιοριστεί πότε και πώς (υποθέτω ότι είναι ένα πινγκ Ajax σε κάποιο σημείο), αλλά παρ 'όλα αυτά, το ανανεώνει.
Περίμενα για την αρχική fb_sig_session_keyσυνεδρία να λήξει, και αρκετά βέβαιος οι σελίδες φίλος που σχετίζονται με την εφαρμογή μου άρχισε να βήχει επάνω λάθη. Σε εκείνο το σημείο, άλλαξα κλειδί τοπικά αποθηκευμένη συνεδρία μου με τη νέα iframe μόνο 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 μόνο».
Επεξεργασία: αρχική παραδοχή μου ότι το κλειδί «iframe μόνο» ενημερώθηκε μέσω κάποιου είδους μεθόδου Ajax ήταν λάθος, αποδεικνύεται αυτές οι τιμές καθορίζονται σε ένα μπισκότο από το Facebook. Αυτό οδηγεί σε ορισμένα προβλήματα μεταξύ τομέων, όταν χρησιμοποιεί αυτά τα cookies. Ρύθμιση μια πολιτική μπισκότο P3P θα ανακουφίσει αυτό με τα περισσότερα προγράμματα περιήγησης, εκτός από το Safari. Εξακολουθεί να μην υπάρχει καλή δουλειά εδώ και Safari.