Facebook - 被授予权限累积?

时间:2014-03-07 17:27:25

标签: facebook-graph-api facebook-javascript-sdk

上下文

Facebook Best Pratices我明白我应该在初始登录页面上请求最小权限集,并延迟扩展权限请求,以确定何时需要它们。

例如。假设我对两个扩展配置文件属性的原始登录请求:

<fb:login-button show-faces="true" width="200" max-rows="1"
     scope="user_photos, friends_photos">
</fb:login-button>

现在,在后一点,用户希望使用我的应用程序(需要publish_actions)将照片上传回他们的个人资料。

据我所知,我的应用程序必须:

  1. 检查用户是否已授予该权限(例如,使用FB.api('/me/permissions'))以避免无理由触发登录流程
  2. 通过执行新登录来请求新的权限:

    FB.login(function(response) {
        // handle the response
    }, {scope: 'publish_actions'});
    
  3. 执行第二次权限检查以查看用户是否已授予新权限。如果用户已授予新权限,则执行上载,否则会显示某种错误消息,向用户解释他应该在上传之前授予新权限。
  4. 我怀疑是:

    1. 在上面列出的第二步中,我应该只询问publish_actions还是我还应该申请已经授予的权限?

      {scope: 'user_photos, friends_photos, publish_actions'});
      
    2. 我正在使用Login on Client, API Calls from Server模型: Login Model

      因此,在我请求新权限的那一刻,我的服务器将持有一个具有两个初始权限(user_photos, friends_photos)的长期访问令牌。如果用户授予publish_actions,我是否应该在上传之前再次通过整个服务器端token exchange进程(使用新的短期访问令牌)?

      GET /oauth/access_token?  
          grant_type=fb_exchange_token&           
          client_id={app-id}&
          client_secret={app-secret}&
          fb_exchange_token={new-short-lived-token} 
      

      或者新权限是否可以立即用于长期令牌?

1 个答案:

答案 0 :(得分:0)

向面临同样问题的任何人回答我自己的问题。

是的,授予的权限是累积的

  1.   
        

    我应该只询问publish_actions还是我还应该申请已经授予的权限?

      

    我只需要申请新的权限。以前授予的权限仍然可用。

  2.   
        

    如果用户授予publish_actions (使用FB.login,我是否应该再次完成整个服务器端令牌交换过程(使用新的短期访问权限 - 令牌)上传之前?或者新的权限是否可以立即用于长期令牌?

      

    客户端呼叫FB.login就足够了。如果用户授予publish_actions,我可以使用先前存储的服务器端令牌发布内容。


  3. 一个小问题:当您致电FB.login时,用户可能会再次跳过该权限(它将返回response.status === "connected")。所以我必须仔细检查权限:

    使用回调检查权限的功能

    function checkPermissions(perms, callback, failCallback) {
        FB.api('/me/permissions', function (response) {
            var fbPerms = response.data[0];
            var haveAllPermissions = true;
            if (typeof perms === 'string') {
                perms = [ perms ];
            }
            for (var i in perms) {
                if (fbPerms[perms[i]] == null) {
                    haveAllPermissions = false;
                    break;
                }
            }
            if (haveAllPermissions) {
                callback();
            } else {
                failCallback();
            }
        });
    }
    

    假设photoUpload是一个需要publish_actions权限的函数,以下是适用于我的使用模式:

    // First check 
    checkPermissions("publish_actions",
        // If the required permissions have already been granted
        // call the desired method
        photoUpload,
        // else
        function () {
            // Asks for permission
            FB.login(function () {
                // double check - the usar may have skiped the permission again
                checkPermissions("publish_actions",
                    // if the user granted the permission, call the desired method
                    photoUpload,
                    // else cancel everything and warn the user
                    function () {
                        alert("Can't post without permissions");
                    });
                }, {scope: "publish_actions"});
            });