usuario sesion registrarse registrado prueba inicio español con boton facebook facebook-authentication

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.