La vittoria è mia!
C'è una funzione di Facebook quasi del tutto privi di documenti che fare con le sessioni iframe, che ho trovato un vago riferimento alla nella mia ricerca. Questa pagina in realtà non spiega bene però, e solo dopo diverse ore di guardare diverse chiavi di sessione nel mio iframe era io in grado di capire cosa stava succedendo.
In precedenza, il mio iframe app riceveva il solito giro di fb_whateverparametri quando si è verificato il carico iframe iniziale. Quindi, nella mia domanda, stavo facendo questo su ogni richiesta:
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'];
Questo codice avrebbe ricevuto il fb_sig_session_keysul carico applicazione iniziale, e vorrei scoiattolo via in un locale $_SESSIONper l'utilizzo con l'API. Memorizzazione nella sessione locale è necessario, perché fb_sig_session_keynon viene mai passata di nuovo a meno che non si ricarica l'intero iframe app.
Così i problemi si è verificato quando questa chiave di sessione scaduta o meno un'ora dopo.
Dopo aver guardato la pagina di riferimento vago , ho iniziato l'esame di tutte le $_REQUESTvariabili mi stavo. Si scopre che anche su un link interno all'interno del vostro iframe app, Facebook modifica la richiesta di passare lungo alcuni parametri. Per qualche ragione, hanno un completamente diverso, ma anche valida chiave di sessione che viene con ogni richiesta iframe!
Questo parametro è chiamato dopo la chiave API di Facebook Application. Quindi, se la tua chiave applicazione API è "XYZ123", ogni richiesta all'interno del vostro iframe ottiene un parametro chiamato xyz123_session_key(così come alcuni altri, come xyz123_expirese xyz123_user).
Dopo aver visto il tempo di scadenza associata per la sessione principale (l'originale fb_sig_session_key) e questa sessione iframe-only ( xyz123_session_key), la luce alla fine del tunnel è apparso: la chiave di sessione tempo di scadenza iframe sola realtà viene aggiornato di tanto in tanto . Non ho deciso quando e come (presumo che sia un ping Ajax ad un certo punto), ma comunque, rinfresca.
Ho aspettato per l'originale fb_sig_session_keydella sessione per scadere, e abbastanza sicuro le pagine amico correlati al mio app iniziato tosse con errori. A quel punto, ho cambiato la mia chiave di sessione memorizzati localmente al nuovo iframe-only xyz123_session_key, e il problema è stato risolto. Quella sessione funziona altrettanto bene come l'originale!
Quindi, il mio fix codice finale è quello di memorizzare la chiave di sessione a livello locale come segue:
$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'];
Questo dà la preferenza al tasto "iframe-only".
Edit: La mia ipotesi originale che il tasto "iframe-only" è stato aggiornato con un qualche tipo di metodo Ajax era sbagliato, si scopre questi valori sono impostati in un biscotto da Facebook. Questo porta ad alcuni problemi tra domini quando si utilizzano questi cookie. L'impostazione di una politica dei cookie P3P allevierà questo con maggior parte dei browser, ad eccezione di Safari. Non esiste ancora un buon lavoro in giro per Safari.