0

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){成功しませんでした。

4

2 に答える 2

2

ここでの問題publish_streamは、拡張アクセス許可です。つまり、ユーザーはそのアクセス許可をオプトアウトできます。一般的に、ユーザーがコールバックのコードブロックにヒットすると、アプリは認証されますが、一部の権限は拡張権限である可能性があるため、必ずしもすべての権限で認証されているとは限りません。response.statusユーザーがアプリケーションを認証したかどうかのステータスを通知するためにのみ使用され、ユーザーが要求したすべてのダイアログプロンプト/権限を受け入れたかどうかは通知されません。あなたの場合、publish_streamは拡張権限であるため、コールバックでユーザーにその権限があるとは限りません。あなたが求めているならpublish_streamユーザーがすでに認証された後の増分アクセス許可として、条件付きチェックオンresponse.statusは常にtrueを返します(定義上、ユーザーはすでにアプリケーションを認証しているため)。

コールバックに権限があることを確認する場合は、グラフAPIのエンドポイントをpublish_stream使用して権限を確認してください。/me/permissions

あなたが欲しいものはこのようなものです:

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' });
于 2012-05-21T22:31:06.333 に答える
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));

`

于 2012-05-21T15:47:57.173 に答える