sesion - login con facebook javascript
auth.statusChange no se activa durante FB.init si el usuario no ha iniciado sesión en Facebook (3)
Me pregunté si alguien ha encontrado una solución al comportamiento que estoy experimentando.
Tomemos el ejemplo del siguiente código:
<script>
window.fbAsyncInit = function() {
FB.init({
appId : ''[----removed-------]'', // App ID
channelUrl : ''http://localhost/channel.html'', // Channel File
status : true, // check login status
cookie : true, // enable cookies
xfbml : true // parse XFBML
});
// Additional initialization code here
FB.Event.subscribe(''auth.statusChange'',fbLoginStatus);
console.log("getloginstatus");
FB.getLoginStatus(fbLoginStatus);
</script>
Al usar FB.init con el estado establecido en verdadero, esencialmente se llama a getLoginStatus()
acuerdo con la documentación de Facebook . Sin embargo, aparentemente se pretende que el comportamiento no active el evento auth.statusChange
, porque el valor predeterminado es "desconocido", y el valor de "no iniciado sesión" también es "desconocido" (¡aunque se puede conocer! )
Por lo tanto, he tenido que hacer una llamada a FB.getLoginStatus()
explícitamente , además de tener el estado establecido en verdadero si quiero responder también a los usuarios que no han iniciado sesión en Facebook.
El problema es que esto hace que se llame a la función dos veces si el usuario no es "desconectado".
¿Hay alguna manera de evitar que esto suceda? Creo que mi única opción podría ser llamar a una función diferente para manejar eventos de cambio de autenticación ...
Mi mejor solución para esto fue establecer el estado en ''falso'' en las opciones fb.init, y luego llamar explícitamente a getloginstatus por separado.
SI get loginstatus regresó como desconocido (es decir, se desconectó), me suscribí al evento de cambio de estado y hago lo habitual para mostrar el botón de inicio de sesión. Luego, cuando el usuario inicia sesión, el cambio de estado se dispara como se esperaba.
Puede verificar la respuesta que recibe después de pasar un parámetro verdadero en getLoginStatus
:
window.fbAsyncInit = function() {
FB.init({
appId : '''',
status : true,
cookie : true,
xfbml : true,
});
FB.getLoginStatus( function(response) {
//console.log(response);
if (response.status === ''connected'') {
var accessToken = response.authResponse.accessToken;
alert(accessToken);
} else if (response.status === ''not_authorized'') {
//login function
} else {
//login function
}
}, true);
FB.Event.subscribe(''auth.authResponseChange'', function(response) {
//console.log(''The status of the session changed to: ''+response.status);
window.location.reload();
});
};
Si establece el status
en true
, el FB.getLoginStatus
almacenará en caché el objeto de respuesta FB.getLoginStatus
y las llamadas posteriores a FB.getLoginStatus
devolverán los datos de esta respuesta almacenada en caché.
Para FB.getLoginStatus
esto, debe llamar a FB.getLoginStatus
con el segundo parámetro establecido en true
para forzar un viaje de ida y vuelta a Facebook, actualizando efectivamente la caché del objeto de respuesta.
FB Docs: https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus/
Una mejor solución que teóricamente debería ahorrarle un viaje de ida y vuelta es la siguiente (coffeescript, pero fácilmente traducible a javascript):
FB.init
appId: appId
channelUrl: channelUrl
status: true # Check Facebook Login status on init
cookies: true
xfbml: false
FB.getLoginStatus (response) =>
@parseResponse(response)
FB.Event.subscribe ''auth.statusChange'', @parseResponse
FB.Event.subscribe ''auth.authResponseChange'', @parseResponse
Todavía estamos usando un manual getLoginStatus para activarse cuando el usuario es desconocido, pero esta vez todavía usamos ''status: true'' para que el estado de inicio de sesión ya esté en caché cuando se llama a getLoginStatus. Al suscribirse a los eventos relevantes solo después de que se haya activado getLoginStatus, nos aseguramos de que el método de manejo parseResponse solo se llame una vez en la carga.