2011-10-22 23 views
9

TL; DR Facebook javascript SDK no puede determinar el estado de inicio de sesión preciso de un usuario que se ha desconectado directamente de facebook.com debajo de él.FB JS-SDK no puede detectar el inicio de sesión del usuario de FB directamente

Estoy desarrollando una aplicación de Facebook usando javascript SDK para la autenticación. Me he dado cuenta de que, cuando el usuario cierra la sesión de Facebook directamente (en facebook.com), el SDK no puede dar sentido al estado de inicio de sesión del usuario en la página de la aplicación. Lo he resumido en el siguiente caso de prueba simple.

Inicie sesión en facebook.com en una sola pestaña. En otra pestaña, renderice la página de la aplicación a continuación (reemplazando MY_APP_ID según corresponda). Si ha iniciado sesión en Facebook como usuario que nunca ha otorgado permisos a esta aplicación, haga clic en "Iniciar sesión" y acceda a ellos. De cualquier manera, debe ver algunos eventos de incendio que indican que está conectado.

Ahora, de vuelta en la pestaña Facebook.com, cierre la sesión de Facebook. Vaya a la pestaña de la aplicación y haga clic en todos los botones (excepto "Iniciar sesión") y observe la salida de la consola del navegador.

  • Cuando FB.logout se llama, no pasa nada. La devolución de llamada nunca se llama. En Chrome, aparece el siguiente error: "JavaScript inseguro intenta acceder al marco con la URL http://my_app.com desde el marco con URL http://www.facebook.com/. Los dominios, protocolos y puertos deben coincidir".

  • Cuando se llama a FB.getLoginStatus, la respuesta dice "conectado" y tiene un objeto authResponse. Esto no es útil, sin embargo, porque ahora es incorrecto. Si, en cambio, se pasa true para el parámetro "force", entonces no pasa nada (nunca se llama a la devolución de llamada).

  • Cuando se llama a FB.getAuthResponse, no ocurre nada (nunca se llama a la devolución de llamada).

  • Ninguno de los eventos relevantes se disparan durante nada de esto (después de cerrar la sesión de Facebook).

La cuestión entonces es que parece que no hay manera posible determinar legítimamente el estado de conexión del usuario desde el SDK en un caso así. O estoy haciendo algo estúpido, aunque lo reduje al mínimo.

Mi objetivo final aquí es que quiero hacer algo en este caso si el usuario hace clic en mi botón de cerrar sesión después de haber cerrado la sesión de Facebook. Pero el SDK no ofrece ningún medio viable para lograr esto.

¿Alguna idea o idea? ¿Alguien más ha experimentado esto y ha encontrado una solución alternativa? ¡Gracias!

página simple aplicación:

<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml' xmlns:fb='http://www.facebook.com/2008/fbml'> 
<head> 
</head> 
<body> 
<script> 
    window.fbAsyncInit = function() { 
    function subFBEvent(name) { 
     FB.Event.subscribe(name, function(r) { 
     console.log(name); 
     console.log(r); 
     }); 
    } 
    subFBEvent('auth.login'); 
    subFBEvent('auth.logout'); 
    subFBEvent('auth.authResponseChange'); 
    subFBEvent('auth.statusChange'); 
    FB.init({ 
     appId : 'MY_APP_ID', 
     status : true, // check login status 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true, // parse XFBML 
     oauth : true  // use OAuth 2.0 
    }); 
    }; 
    (function() { 
    var s = document.createElement('div'); 
    s.setAttribute('id','fb-root'); 
    document.documentElement.getElementsByTagName("body")[0].appendChild(s); 
    var e = document.createElement('script'); 
    e.src = 'http://connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    s.appendChild(e); 
    }()); 
</script> 
<button onclick="FB.logout(function(r) { console.log('FB.logout'); console.log(r); });">Logout</button> 
<button onclick="FB.getLoginStatus(function(r) { console.log('FB.getLoginStatus'); console.log(r); });">LoginStatus</button> 
<button onclick="FB.getAuthResponse(function(r) { console.log('FB.getAuthResponse'); console.log(r); });">AuthResponse</button> 
<fb:login-button>Login</fb:login-button> 
</body> 
+0

Sólo forzando una ida y vuelta a los servidores de Facebook. Mira http://stackoverflow.com/questions/9482876/how-to-detect-user-logging-out-of-facebook-after-logging-into-my-app/16227872#16227872 – Delmo

Respuesta

-2

En primer lugar: ¿por exactamente lo que quiere hacer esto?

El inicio de sesión de Facebook es básicamente una conveniencia para los usuarios de Facebook para evitar llenar un formulario de inicio de sesión o de inicio de sesión en su página web. Permite una fácil configuración de una sesión de usuario en su propio sitio web, pero hasta donde yo sé, no le da derecho a registrar directamente a un usuario fuera de su sesión en Facebook (ni a ningún otro sitio habilitado para iniciar sesión en Facebook como Stackoverflow)Esto también funciona al revés: si un usuario cierra sesión en Facebook, eso no significa que deba perder todas las demás sesiones establecidas a través de un inicio de sesión en Facebook.

0

No creo que esta solución lo ayude ahora, pero lo estoy publicando para que otros no lo pasen tan mal. Esto se debe a que no está implementando el método FB.getLoginStatus correctamente. todo lo que tiene que hacer es poner en práctica este método

FB.getLoginStatus(function(response) { 
    statusChangeCallback(response); 
    }); 

después de la llamada init. Este método llamará al método statusChangeCallback y realizará la autenticación.

function statusChangeCallback(response) { 
    console.log('statusChangeCallback'); 
    console.log(response); 
    // The response object is returned with a status field that lets the 
    // app know the current login status of the person. 
    // Full docs on the response object can be found in the documentation 
    // for FB.getLoginStatus(). 
    if (response.status === 'connected') { 
     // Logged into your app and Facebook. 
     testAPI(); 
    } else if (response.status === 'not_authorized') { 
     // The person is logged into Facebook, but not your app. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into this app.'; 
    } else { 
     // The person is not logged into Facebook, so we're not sure if 
     // they are logged into this app or not. 
     document.getElementById('status').innerHTML = 'Please log ' + 
     'into Facebook.'; 
    } 
    } 

para más referencia se puede hacer referencia esta página de la documentación oficial https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

+0

Esto no tiene Parece que funciona. Un simple test-login en su página. ejecute FB.getLoginStatus y observe la respuesta. En otra pestaña, cierre sesión en Facebook, regrese a su página y vuelva a ejecutar el comando: en lo que respecta a la API, aún está conectado. Actualice su página, vuelva a ejecutar FB.getLoginStatus, finalmente, los avisos de página. – mseddon

+0

sí, no hace ping constantemente al servidor de fb para conocer el estado, pero cuando llama a una API aprueba y funciona de esa manera. –

+0

De hecho, al cambiar su FB.getLoginStatus para tener un parámetro adicional 'true', el estado se consultará directamente, solucionando el problema. – mseddon

Cuestiones relacionadas