2012-05-21 3 views
0

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

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

Проблема заключается в том, что это возвращение ВСЕГДА правда, это не имеет значения, если user: logins, ommits или закрывает всплывающее окно.

любая идея почему?

попытался также: если (response.authResponse) {без успеха ..

+0

Что вы имеете в виду "возвращает истину? Вы не должны ничего делать с возвращаемым значением FB.login, поскольку оно асинхронно. –

+0

if (response.status == 'connected'), он всегда прав. Поэтому response.status «подключен», даже если пользователь отказывается или закрывает запрос диалогового окна разрешения. –

ответ

2

Проблема заключается в том, что publish_stream является extended permission, что означает, что пользователь может отказаться от этого разрешения. Вообще говоря, когда пользователь обращается к блоку кода в своем обратном вызове, он аутентифицировал ваше приложение, но не обязательно со всеми разрешениями, которые вы запрашивали, поскольку некоторые из них могут быть extended permissions. 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' }); 
0

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

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

`