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