Pregunta

Para comprobar si el demandante ha otorgado todos los permisos necesarios, lo hago así:

    FB.login(function(response){
             console.log(response.status);
            if (response.status == 'connected') {
               /* user gave permssions */
            }else{
                 /* user didnt, unmark the checkbox */
                 $('input:checkbox').removeAttr('checked');
            }
    }, { scope: 'publish_stream' });

El problema es que esto siempre vuelve a ser verdadero, no importa si el usuario:inicia sesión, omite o cierra la ventana emergente.

¿Alguna idea de por qué?

También probé:if (response.authResponse) { sin éxito.

¿Fue útil?

Solución

El problema aquí es que publish_stream es un permiso extendido, lo que significa que el usuario puede optar por no recibir ese permiso.En términos generales, cuando un usuario accede al bloque de código en su devolución de llamada, ha autenticado su aplicación, pero no necesariamente con todos los permisos que solicitó, ya que algunos de ellos pueden ser permisos extendidos. response.status solo se utiliza para comunicar el estado de si el usuario ha autenticado la aplicación, no si ha aceptado o no todas las indicaciones de diálogo/permisos que ha solicitado.En tu caso, publish_stream es un permiso extendido, por lo que no se garantiza que tenga ese permiso para el usuario en su devolución de llamada.Si estas pidiendo publish_stream como un permiso incremental después de que un usuario ya se haya autenticado, entonces su verificación condicional en response.status siempre devolverá verdadero (ya que, por definición, el usuario ya ha autenticado su aplicación).

Si quieres verificar que tienes el publish_stream permiso en su devolución de llamada, verifique el permiso usando /me/permissions punto final en la API del gráfico.

Lo que quieres es algo como esto:

FB.login(function(response){
    if (response.status == 'connected') {
        FB.api('/me/permissions', function(response) {
            var permsArray = response.data[0];
            // Permissions that are needed for the app
            var permsNeeded = ['publish_stream'];
            var permsToPrompt = [];
            for (var i in permsNeeded) {
                if (permsArray[permsNeeded[i]] == null) {
                    permsToPrompt.push(permsNeeded[i]);
                }
            }

            if (permsToPrompt.length > 0) {
                $('input:checkbox').removeAttr('checked');
            }
         }
    } else {
        /* user didnt, unmark the checkbox */
        $('input:checkbox').removeAttr('checked');
    }
}, { scope: 'publish_stream' });

Otros consejos

No sé por qué, pero el siguiente código funciona bien para mí al menos ~

window.fbAsyncInit = function() {
  FB.init({
  appId      : '<?php echo FACEBOOK_APP_ID ?>',
  status     : true, 
  cookie     : true,
  xfbml      : true,
  oauth      : true,
  });
 FB.getLoginStatus(function(response){
  if (response.status === 'connected') {
    // the user is logged in and has authenticated your
    // app, and response.authResponse supplies
    // the user's ID, a valid access token, a signed
    // request, and the time the access token 
    // and signed request each expire
    var uid = response.authResponse.userID;
    var accessToken = response.authResponse.accessToken;
    var signed_request = response.authResponse.signedRequest;
    // avoid using cookie
    self.location= "<?php echo site_url()?>/signup/fb_login/"+uid;

  } else if (response.status === 'not_authorized') {
    // the user is logged in to Facebook, 
    // but has not authenticated your app
    FB.login(function(response) {
    if (response.authResponse) {
      self.location="<?php echo site_url()?>/signup/fb_register";
      /* FB.api('/me', function(response) { */
      /*   }); */
    }  }, {scope: 'email,user_hometown'});
  } else { // unknown
    // the user isn't logged in to Facebook.
  }
});
  FB.Event.subscribe('auth.login', function(response) {
      window.location.reload();
    });
    FB.Event.subscribe('auth.logout', function(response) {
      window.location.reload();
    });
 };
(function(d){
 var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
  js = d.createElement('script'); js.id = id; js.async = true;
  js.src = "//connect.facebook.net/en_US/all.js";
  d.getElementsByTagName('head')[0].appendChild(js);
  }(document));

`

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top