Rinfrescante sessione di Facebook da un'applicazione iframe

voti
13

Ho un'applicazione Facebook iframe che è completamente esterna. Con questo voglio dire che una volta che un utente accede all'URL tela per caricare l'applicazione, tutti i link in app iframe andare al mio server, e la pagina di tela non viene mai aggiornati a meno che l'utente si sposta da qualche altra parte su Facebook e torna (o fa un aggiornamento del browser).

Sul carico iniziale dell'app in cui Facebook crea l'iframe, vengo superato tutti i parametri, come al solito fb_sig_user che mi permette di creare una sessione di un'applicazione interna in base all'utente facebook. Questa sessione app (che è non è la sessione di Facebook, è il mio propria sessione app) è tutto quello che serve per consentire all'utente di lavorare con l'applicazione.

Il problema arriva un'ora più tardi. Se l'utente lascia il computer, o utilizza l'applicazione per più di un'ora, la sessione di Facebook scade. Ci sono alcune pagine di app che richiedono informazioni amico recupero, e una volta che la sessione di FB è scaduto, queste pagine si rompono, buttare fuori gli errori come ad esempio Errore: chiave di sessione non valida o non più validi.

La mia domanda è se c'è un modo per aggiornare la sessione di Facebook dell'utente dall'interno di un'applicazione iframe per tenerlo da scadenza un'ora dopo. Eseguire una delle chiamate API fanno questo? C'è un trucco Facebook Connect il ping qualcosa? Esiste un metodo definitivo per tenerlo in vita? Non sono stato in grado di trovare qualsiasi esempi che riguardano specificamente questo.

È pubblicato 07/05/2009 alle 18:38
fonte dall'utente
In altre lingue...                            


2 risposte

voti
21

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.

Risposto il 08/05/2009 a 00:32
fonte dall'utente

voti
2

basta mettere

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

sulla parte superiore della pagina e non perderete la sessione in iframe.

Ho anche notato che questa discussione è buono 2 anni e mezzo di età. Ho appena imbattuto utilizza Google. Forse il mio post vi aiuterà a qualcun altro che si imbatte in questo.

Risposto il 28/01/2012 a 11:46
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more