2011-10-03 11 views
6

NOTA: Nuestra aplicación (web) funcionaba correctamente hasta que pasamos al flujo de trabajo Oauth 2.0 el pasado fin de semana.FB auth.logout se está iniciando después de haber iniciado sesión utilizando "server-side-workflow" (OAuth 2.0)

Cuando un usuario "se conecta con Facebook" a nuestra aplicación (web), inicia sesión en Facebook utilizando el "flujo de trabajo del servidor" descrito en el Facebook Authentication docs. Sin embargo, Facebook está subiendo el caso auth.logout cuando el usuario llega a su página de inicio en nuestra aplicación que contiene el siguiente código 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'); 
} 

Parece ser que mientras el usuario está conectado a Facebook, que no se registran en nuestra aplicación (si tiene facebook.com abierto en una segunda pestaña de su navegador y vuelve a cargar la página después de haber iniciado sesión en nuestra aplicación, verá que ya ha iniciado sesión en facebook.com).

¿Hay algún paso adicional en OAuth 2.0 que se deba tomar para registrar al usuario en nuestra aplicación cuando se utiliza el "flujo de trabajo del servidor" que no era necesario en la versión anterior de OAuth? ¿El usuario tiene que iniciar sesión explícitamente a través de Facebook después de estar conectado?

Cualquier ayuda sería muy apreciada.

Gracias de antemano, Jason

PD- Inicio de sesión en nuestra aplicación a través del flujo del lado del cliente (después de haber conectado previamente) funciona bien. Solo cuando se conecta y se inicia sesión a través del flujo de trabajo del lado del servidor experimentamos el problema de cierre de sesión automático.

+3

yo era capaz de solucionar este problema mediante la adición de una llamada a FB.getLoginStatus en mi controlador de eventos auth.logout y comprobar la respuesta para un objeto authResponse. No sé por qué Facebook aumenta el auth.logout cuando FB.getLoginStatus devuelve una authResponse que indica que el usuario ha iniciado sesión, pero lo hace. Entonces, esto es un truco: FB.Event.subscribe ('auth.logout', función (respuesta) { FB.getLoginStatus (función (res) { if (! Res.authResponse) { logout(); } }); }); – Jason

+0

¡Un gran hallazgo! Me pregunto si todavía ocurre o si Facebook ha arreglado esto ... – DMCS

+0

Acabo de empezar a ver este comportamiento en mi aplicación hoy también. Tuve el mismo truco que tú pero estoy un poco incómodo con eso. –

Respuesta

0

Para páginas ajax necesita obtener el uid, access_token y/o código de la sesión de navegadores.

Esto es estándar para iframes y ajax para prevención de clickjack y otros riesgos de seguridad. VER: http://tools.ietf.org/html/rfc6749#section-10.13


RÁPIDO Y EJEMPLO sucio:

<?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 } 

?> 
Cuestiones relacionadas