Facebook需要扩展权限:publish_actions

时间:2012-08-23 19:03:27

标签: facebook facebook-graph-api facebook-apps

我正在开发一个与竞赛和推广相关的Facebook应用程序,我的目的是在我公司的页面上创建一个标签,用于访问该应用程序。

一旦用户,用户可以提名本地公司获奖。稍后的;一旦获得提名,用户就可以投票选出获胜者。

我已将Open Graph集成到我的应用中,以便我可以利用对象类型(Organization),动作类型(NominateVote For)和聚合({{ 1}})。我的主要目标是将这些操作转移到用户的时间线上。

我使用了recipebox示例作为我的基础。我提供了代码来演示身份验证和提交动作类型/对象类型组合所需的后期操作。

Nominations

测试用户遇到以下错误:

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"> 
<head prefix="og: http://ogp.me/ns# og_<<app namespace>>: http://ogp.me/ns/apps/<<app namespace>>#"> 
    <meta property="fb:app_id" content="<<app id>>" /> 
    <meta property="og:type" content="<<app namespace>>:organization" /> 
    <meta property="og:title" content="Client 1" /> 
    <meta property="og:image" content="<<client image path>>" /> 
    <meta property="og:description" content="Client 1 description here ... " /> 
    <meta property="og:url" content="<<custom client URL>>">
    <script src="http://connect.facebook.net/en_US/all.js"></script>
    <script type="text/javascript">
        // Load the SDK Asynchronously
        (function(d){
            var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
            if (d.getElementById(id)) {return;}
            js = d.createElement('script'); js.id = id; js.async = true;
            js.src = "//connect.facebook.net/en_US/all.js";
            ref.parentNode.insertBefore(js, ref);
        }(document));

        // Init the SDK upon load
        window.fbAsyncInit = function() {
            FB.init({
                appId      : '<<app id>>', // App ID
                status     : true, // check login status
                cookie     : true, // enable cookies to allow the server to access the session
                xfbml      : true  // parse XFBML
            });

            // listen for and handle auth.statusChange events
            FB.Event.subscribe('auth.statusChange', function(response) {
                if (response.authResponse) {
                    // user has auth'd your app and is logged into Facebook
                    FB.api('/me', function(me){
                        if (me.name) {
                            document.getElementById('auth-displayname').innerHTML = me.name;
                        }
                    })
                    document.getElementById('auth-loggedout').style.display = 'none';
                    document.getElementById('auth-loggedin').style.display = 'block';
                } else {
                    // user has not auth'd your app, or is not logged into Facebook
                    document.getElementById('auth-loggedout').style.display = 'block';
                    document.getElementById('auth-loggedin').style.display = 'none';
                }
            });

            // respond to clicks on the login and logout links
            document.getElementById('auth-loginlink').addEventListener('click', function(){
                FB.login();
            });
            document.getElementById('auth-logoutlink').addEventListener('click', function(){
                FB.logout();
            });
        }       

        function nominate () {
            FB.api('/me/<<app namespace>>:Nominate&organization=<<custom client URL>>', 'post',  function(response) {

                if (! response || response.error) {
                    alert('Error occured');
                    console.log(response);
                } else {
                    alert('Post was successful! Action ID: ' + response.id);
                }
            });
        }
    </script>
</head> 
<body> 
    <div id="fb-root"></div>
    <div id="auth-status">
        <div id="auth-loggedout">
            <a href="#" id="auth-loginlink">Login</a>
        </div>
        <div id="auth-loggedin" style="display:none">
            Hi, <span id="auth-displayname"></span>  
            (<a href="#" id="auth-logoutlink">logout</a>)
        </div>
    </div>
    <h2>Client 1</h2> 
    <form>
        <input type="button" value="Nominate" onclick="nominate()" />
    </form> 
    <fb:activity actions="<<app namespace>>:nominate"></fb:activity>
</body> 
</html>

我遇到以下错误(我是此应用的管理员):

Requires extended permission: publish_actions

第一个错误令我感到不安。我无法从This method must be called with an app access_token 中选择publish_actions。此外,我所附的补救措施建议我将我的应用重新归类为Apps | <My App> | Permissions | Extended Permissions(这不起作用)并完成我的聚合(我做了;但仍无效)。

  1. 如何克服此错误?
  2. 我该怎么做才能修复我的 Games错误?
  3. 提前致谢,

    麦克

    修改

    我相信我遇到的This method must be called with an app access_token错误是因为我直接在页面标签网址上测试/与应用互动;不是通过Facebook。

    我不再收到access_token;但是,我的测试人员和开发人员都是。我知道我遇到此错误,因为在初始facebook.com登录提示时未请求publish_actions权限。

    如果我的开发人员/测试人员退出Facebook,请使用我的提示重新登录:

    Requires extended permission: publish_actions error

    然后将此权限和应用程序集成到他们的Facebook会话中。

    我的最后一个问题是 - 是否有一个事实上的首选方法来申请此权限而无需登录/退出Facebook?

2 个答案:

答案 0 :(得分:2)

我修复了我的两个错误。感谢那些向我提供反馈并让我走上正确道路的人。

这些错误已经解决:

1. Requires extended permission: publish_actions

2. This method must be called with an app access_token 

首先,CBroe是对的。由于我需要扩展权限(publish_actions),我需要在FB.login()中的回调函数之后指定这是我的选项对象,如下所示:

FB.login(function (response) {
    if (response.authResponse) { // The user has authenticated
        authenticatedSoDoSomething();
    } 
    else { // The user has not authenticated
        notAuthenticatedSoDoSomethingElse(); 
    }
}, { scope:'publish_actions' });

最后,我没有成功使用JavaScript SDK通过FB.api()向用户的时间轴发布操作。这是我 使用的代码:

FB.api('/me/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'post',
    function(response) {
        if (! response || response.error) {
            alert('Error occured');
        } else {
            alert('Post was successful! Action ID: ' + response.id);
        }
})

我忽略了包含应用访问令牌。可以通过连接app id,然后是管道,然后是app secret来构建app访问令牌。

我使用PHP SDK来完成此请求,因为我想保密我的api秘密。这是我使用的代码中的[大部分]:

require_once('facebook-php-sdk/src/facebook.php');

$facebook = new Facebook(
    array(
        'appId' => '<<my app id>>', 
        'secret' => '<<my app secret>>'));

$user = $facebook->getUser();

if ($user) {
    try {
        $user_profile = $facebook->api('/me');
    } 
    catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
        echo json_encode(array('success' => false));
    }
}

try {
    $facebook->api('/' . $user . '/<<app namespace>>:<<my action>>&<<my object>>=<<a URL>>', 'POST', array('access_token' => $facebook->getAppId() . '|' . $facebook->getApiSecret()));
}
catch (FacebookApiException $e) {
    echo var_dump($e->getResult());
}

希望这有帮助!

答案 1 :(得分:0)

对于第二个,请使用App Access Token拨打电话,如错误所示;如果您已经这样做并且它失败了,请检查应用程序未在Facebook App仪表板的应用程序设置中设置为“本机/桌面”模式。如果是,则应用程序访问令牌不受信任,并且API就像您没有提供它一样。

首先,您确定用户是否授予您应用的publish_actions权限?使用用户的访问令牌调用/me/permissions将显示授予的权限。请注意,经过身份验证的推介/应用中心登录流程与您的应用的常规流量是分开的,对于那些通过经过身份验证的推荐或应用中心而不是最终用户的用户,因此请检查publish_actions中是否包含scope在你对Oauth对话的调用中。