Вопрос

чтобы проверить, предоставил ли suer все необходимые разрешения, я делаю это так:

    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' });

Проблема в том, что это всегда возвращает true, не имеет значения, если пользователь:входит в систему, пропускает или закрывает всплывающее окно.

есть идеи, почему?

Также попробовал:if (response.authResponse) {безуспешно..

Это было полезно?

Решение

Проблема здесь в том, что publish_stream является расширенное разрешение, что означает, что пользователь может отказаться от этого разрешения.Вообще говоря, когда пользователь нажимает на блок кода в вашем обратном вызове, он аутентифицирует ваше приложение, но не обязательно со всеми запрошенными вами разрешениями, поскольку некоторые из них могут быть расширенные разрешения. response.status используется только для сообщения о том, прошел ли пользователь аутентификацию приложения, а не о том, принял ли он все запрошенные вами диалоговые подсказки/разрешения.В твоем случае, publish_stream — это расширенное разрешение, поэтому вам не гарантируется наличие этого разрешения для пользователя в вашем обратном вызове.Если вы просите publish_stream в качестве дополнительного разрешения после того, как пользователь уже прошел аутентификацию, тогда ваша условная проверка response.status всегда будет возвращать true (поскольку по определению пользователь уже аутентифицировал ваше приложение).

Если вы хотите убедиться, что у вас есть publish_stream разрешение в обратном вызове, проверьте разрешение, используя /me/permissions конечная точка на графике API.

То, что вы хотите, это что-то вроде этого:

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' });

Другие советы

Я не знаю почему, но следующий код работает нормально для меня, по крайней мере, ~

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));
.

`

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top