Facebook Javascript SDK重新申请权限没有提示

时间:2014-12-24 20:48:19

标签: javascript facebook permissions facebook-javascript-sdk

自从我上次去以后一直无法解决这个问题,但我在此之后重新构建了代码 https://developers.facebook.com/blog/post/576/

我无法触发重新请求接受所有权限(忽略警报文本内容,因为这会更改为告诉用户有关需要权限的原因)

这是登录代码

jQuery(function() {
  $('body').prepend('<div id="fb-root"></div>');
  return $.ajax({
    url: "" + window.location.protocol + "//connect.facebook.net/en_US/all.js",
    dataType: 'script',
    cache: true
  });
});

window.fbAsyncInit = function() {
  return FB.init({
    appId: '<%= ENV["FACEBOOK_KEY"] %>',
    cookie: true
  });
};


var permsNeeded = ["email", "user_birthday", "user_friends"];

var checkPermissions = function() {
  var promptForPerms;
  FB.api("/me/permissions", function(response) {
    var i, permsArray, permsToPrompt;
    permsArray = response.data[0];
    permsToPrompt = [];
    for (i in permsNeeded) {
      if (permsArray[permsNeeded[i]] == null) {
        permsToPrompt.push(permsNeeded[i]);
      }
    }
    if (permsToPrompt.length > 0) {
      alert("Need to re-prompt user for permissions: " + permsToPrompt.join(","));
      promptForPerms(permsToPrompt);
    } else {
      alert("No need to prompt for any permissions");
    }
  });

  promptForPerms = function(perms) {};
  FB.login((function(response) {
    console.log(response);
  }), {
    scope: perms.join(","),
    auth_type: "rerequest"
  });

$("#sign_in").click(function(e) {
    e.preventDefault();
    return FB.login((function(response) {
      if (response.authResponse) {
        checkPermissions();
      }
    }), {
      scope: permsNeeded.join(',')
    });
  });
};

有关修改或更改内容的任何建议?我完全不知道该做什么。现在,无论您拒绝或允许什么,都不会发出任何警报。

2 个答案:

答案 0 :(得分:3)

似乎代码中存在一些错误。我强烈建议您正确格式化代码并设置样式。

我修复了错误,您可以参考下面的修订代码。

请注意,这是使用facebook jssdk v2.2。

window.fbAsyncInit = function() {
  FB.init({
    appId      : '960839450617376',
    xfbml      : true,
    version    : 'v2.2'
  });
  init();
};

(function(d, s, id){
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/sdk.js";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));

function init() {
  var permsNeeded = ["email", "user_birthday", "user_friends"];

  var checkPermissions = function() {
    var promptForPerms;
    FB.api("/me/permissions", function(response) {
      var permsArray, permsToPrompt;
      permsArray = response.data;
      permsToPrompt = [];
      console.log(JSON.stringify(permsArray));
      for (var i = 0, ilen = permsArray.length; i < ilen; i++) {
        console.log(permsArray[i].permission, permsArray[i].status);
        if (permsNeeded.indexOf(permsArray[i].permission) != -1 && permsArray[i].status != 'granted') {
          permsToPrompt.push(permsArray[i].permission);
        }
      }
      console.log(permsToPrompt);
      if (permsToPrompt.length > 0) {
        alert("Need to re-prompt user for permissions: " + permsToPrompt.join(", ") + '.\nPlease try again and allow the permission mentioned.');
      } else {
        alert("No need to prompt for any permissions");
      }
    });

  };
  $("#sign_in").click(function(e) {
    console.log('sign in');
    e.preventDefault();
    return FB.login(
      function(response) {
        if (response.authResponse) {
          checkPermissions();
        }
      }, {
        scope: permsNeeded.join(','),
        return_scopes: true,
        auth_type: 'rerequest'
      }
    );
  });
}

如您所见,我已更改permsArray = response.data[0]; => permsArray = response.data;

这是因为当我请求权限列表时,我会收到以下json示例

{
  data: [
    {
      "permission":"public_profile",
      "status":"granted"
    },
    {
      "permission":"email",
      "status":"granted"
    },
    {
      "permission":"user_birthday",
      "status":"granted"
    },
    {
      "permission":"user_friends",
      "status":"granted"
    }
  ]
}

我还编辑了循环以检查哪个权限被拒绝。

我们要求用户再次点击登录按钮,而不是通过代码重新登录登录,以便允许登录弹出窗口(通过点击事件)。

我还将auth_type: 'rerequest'设置为登录请求的默认值,因为如果授予所有权限,我没有看到任何提示权限。

答案 1 :(得分:0)

@Jeff Caspian

这是获取用户电子邮件地址的正确方法,非常感谢我几乎被打了2天。 实际上很多人都向Facebook团队报告他们实际上也无法获得电子邮件地址的错误。

FB.api("/me/permissions", function(response) {

}

这是再次感谢我的电话。