4

我想在呈现 iframe 登录以请求扩展权限之前检查登录用户的权限,但 iframe 弹出窗口被浏览器阻止(ff,chrome 测试)。我想避免这种情况,我很确定这是因为 js 函数的结果是“嵌套的”——我的 js 聪明才智是有限的,所以请原谅。

我猜如果我可以在不传递结果的情况下将所有内容保留在原始函数中,浏览器仍然会将登录 iframe 视为“用户启动”而不是阻止。

但我无法做到这一点 - 例如为什么以下结果会导致数据 = 未定义。

var data = FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 });
alert(data); // = undefined

我当前的完整代码是:

<button id="myButton" >Test Publish Event</button>

<script>

$('#myButton').bind('click', function() {

FB.getLoginStatus(function(response) {

if (response.session) {
// logged in and connected user, someone you know

FB.api(
  {
    method: 'fql.query',
    query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
  },
  function(response) {
        if(response[0].create_event == 1) {
                alert('permission granted');
        } else {
            alert('permission absent');

    FB.login(  function(response) {if (response.session) {
        handleSessionResponse(response);
        if (response.perms) {
          // user is logged in and granted some permissions.
          // perms is a comma separated list of granted permissions
          alert(response.perms);
            } else {
          // user is logged in, but did not grant any permissions       
        }
      } else {
        // user is not logged in
      }
    }, {perms:'create_event,rsvp_event'});

    }
  }
);
</script>
4

2 回答 2

8

耶 !同样的问题问题(当然不是同样的问题,但同样需要的功能)困扰了我很多,但最终在对各种来源进行了数小时的研究后,我找到了解决方案!

第一

var data = FB.api(

这是错误的!因为所有 fb 请求都是异步执行的,并且检索数据值的唯一方法是在请求执行后在该请求中。前任

FB.api(
{
method: 'fql.query',
query: 'SELECT create_event FROM permissions WHERE uid=' + response.session.uid
 },function(response){
This function will run after the request is finished and ONLY inside here you can read the results data
ex  alert(response.data);
});         
  }
});

第二次您的权限请求弹出被 chrome 出于安全原因阻止(firefox 允许其他浏览器要求允许或不允许)

“只有从用户操作事件(例如 .onclick)打开一个弹出窗口才能允许”因此您可以将该功能附加到允许的 .onclick 事件。

第三,我检查用户是否具有使用您的应用所需的权限的解决方案是:

 FB.getLoginStatus(function(response) {
 if (response.status.toString().indexOf("connected")>-1) {
    initAll();
  } else {

requestPermisions proceedure
 }

此函数检查用户是否已连接并已授予您的应用程序的权限,否则返回 response.status = "unknown"。

现在....

权限弹窗问题有两种解决方法。

第一个解决方案 = 将 FB.login() 函数附加到 button.Ex 的 onclick 事件。

     ifUserNotgrandedPermisions{document.getElementByid("aLogInButton").onclick = function(){
 FB.login(....blah blah blah);
 };

第二个解决方案,我实现的一个是将 iFrame 重定向到请求权限页面,而不是弹出

下面是一个完整的解决方案,它检查用户是否已登录并授予权限...如果没有,它要求用户登录然后请求权限(如果已登录,只需询问权限)(如果有权限,只需登录)

    FB.init({appId: 'YourAPPID', status: true, cookie: true, xfbml: true, oauth : true});
    FB.getLoginStatus(function(response) {
   if (response.status.toString().indexOf("connected")>-1) {
     initAll(); //User is connected and granted perms Good to go!
   } else { 

//top.location 更改浏览器 url 而不是 iframe 的 url

//这个 url 是专门为你的应用请求 perms 而形成的。您更改权限和您的 appID

//redirect_uri = 将此更改为您的应用程序画布页面

          top.location=window.location="http://www.facebook.com/dialog/oauth/?scope=read_stream,publish_stream,friends_photos,friends_activities&client_id="yourAPPID(nobrackets)"&redirect_uri=http://apps.facebook.com/filtered_feed/&response_type=code";}});};
于 2011-09-22T22:59:19.060 回答
1
FB.init({
   appId: 'YOUR APP ID', 
   status: true, 
   cookie: true,
   xfbml: true,
   oauth : true
});
FB.getLoginStatus(function(response) {
  if (response.status === 'connected') {
    /*var uid = response.authResponse.userID; //FACEBOOK_ID
    var accessToken = response.authResponse.accessToken;*/ //ACCESS TOKEN
    FB.Canvas.setAutoResize();
    if (response.authResponse) {
        // logged in and connected user, someone you know. 
        //  YOUR SUCCESS CODE HERE
    }
  }else {
      attemptLogin();
  }
 });

打开弹出窗口以登录 facebook 和授权的功能。

function attemptLogin(){
   FB.login(function(response) {
      if (response.authResponse) {
          login();
        } else {
          //if user didn't logged in or didn't authorize your application
      }
  }, {scope: 'offline_access,publish_stream,manage_pages'}); //YOUR PERMISSION
}
于 2012-01-06T11:11:18.773 回答