2011-10-03 8 views
6

NOTA: la nostra applicazione (web) funzionava correttamente fino all'aggiornamento al flusso di lavoro Oauth 2.0 lo scorso weekend.FB auth.logout viene sollevato dopo aver effettuato l'accesso utilizzando "server-side-workflow" (OAuth 2.0)

Quando un utente "si connette con facebook" alla nostra applicazione (web), le registra su Facebook utilizzando il "flusso di lavoro lato server" descritto nello . Tuttavia, Facebook sta sollevando l'evento auth.logout quando l'utente arriva a loro home page nella nostra applicazione, che contiene il seguente codice javascript:

window.fbAsyncInit = function() { 
    FB.init({appId: 'XXX', status: true, cookie: true, xfbml: true, channelUrl: 'http://XXX/fbchannel.html', oauth: true}); 
    FB.Event.subscribe('auth.logout', function(response) { 
     logout(); 
    }); 
}; 
(function() { 
    var e = document.createElement('script'); 
    e.type = 'text/javascript'; 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
}()); 
function logout(){ 
    new Ajax.Request('http://XXX/logout'); 
} 

Sembra che mentre l'utente è connesso a Facebook, che non vengono registrati nella nostra applicazione (se hai facebook.com aperto in una seconda scheda del tuo browser e ricarichi la pagina dopo esserti autenticato dalla nostra applicazione, vedrai che sei effettivamente collegato a facebook.com).

C'è un ulteriore passaggio in OAuth 2.0 che è necessario eseguire per registrare l'utente nella nostra applicazione quando si utilizza il "flusso di lavoro sul lato server" che non era necessario nella versione precedente di OAuth? L'utente deve accedere esplicitamente tramite Facebook dopo essere stato connesso?

Qualsiasi aiuto sarebbe molto apprezzato.

Grazie in anticipo, Jason

PS- registrazione nella nostra applicazione tramite il flusso lato client (dopo aver collegato in precedenza) funziona bene. È solo quando ci si connette e si esegue l'accesso tramite il flusso di lavoro lato server, ma si verifica il problema di disconnessione automatica.

+3

sono stato in grado di risolvere questo problema con l'aggiunta di una chiamata a FB.getLoginStatus nel mio gestore di eventi auth.logout e controllando la risposta per un oggetto authResponse. Non so perché Facebook solleva il file auth.logout quando FB.getLoginStatus restituisce una authResponse che indica che l'utente ha effettuato l'accesso, ma lo fa. Quindi, questo è un trucco: FB.Event.subscribe ('auth.logout', function (response) { FB.getLoginStatus (function (res) { if (! Res.authResponse) { logout(); } }); }); – Jason

+0

Grande scoperta! Mi chiedo se si verifica ancora o se Facebook ha risolto questo ... – DMCS

+0

Ho appena iniziato a vedere questo comportamento nella mia applicazione oggi pure. Mi sono inventato lo stesso trucco di te, ma mi sento un po 'a disagio. –

risposta

0

Per le pagine Ajax è necessario ottenere uid, access_token e/o codice dalla sessione del browser.

Questo è lo standard per iframe e ajax per la prevenzione del clickjack e altri rischi per la sicurezza. VEDI: http://tools.ietf.org/html/rfc6749#section-10.13


RAPIDO ED ESEMPIO DIRTY:

<?php 
// be sure to exchange YourAppId, with your app id. 

if(isset([fb_YourAppId_user_id])){ 
$user = [fb_YourAppId_user_id]; 
}else { // no user, send to login flow. } 

if(isset([fb_YourAppId_access_token])){ 
$access_token = [fb_YourAppId_access_token]; 
} else { // no user, send to login flow } 

?>