服务器端调用后,客户端访问令牌不起作用(FB Graph API v2.0)

时间:2014-05-12 16:16:06

标签: facebook-graph-api

首先,Facebook用户使用Facebook JS SDK登录客户端。

使用以下参数调用FB.init():

{
  version    : 'v2.0',
  appId: '...',
  status     : true,
  cookie     : true,
  xfbml      : false
}

然后,在PHP中,创建一个会话:

$session = (new FacebookJavaScriptLoginHelper())->getSession();

一旦从PHP调用FB API,我仍然可以继续使用js调用FB API。

但是,只要我的页面向服务器发送新命令指示它进行FB API调用,它就不会再次运行,并且FB API说:

  

请求此资源需要访问令牌。

显然,这再被召唤一次,之后就停止了工作:

$session = (new FacebookJavaScriptLoginHelper())->getSession();

如果用户在浏览器中更新页面,则服务器的下一次调用将再次起作用。我想要的是在不重新加载页面的情况下同时从服务器和浏览器查询FB API。

1 个答案:

答案 0 :(得分:0)

它已过时,但可能会帮助某人

<?php 
//some code here - requires and uses
FacebookSession::setDefaultApplication($SETTINGS['fbappid'], $SETTINGS['fbsecret']);
$helper = new FacebookJavaScriptLoginHelper();

$session;
try {
    $session = $helper->getSession();
} catch(FacebookRequestException $ex) {
    //
} catch(\Exception $ex) {
    //
}

?>

<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>
    <body>
    <script>
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '<?php echo $SETTINGS['fbappid'] ?>',
            xfbml      : true,
            version    : 'v2.0',
            status     : true,
            cookie     : true
        });


        FB.getLoginStatus(function(response) {
            if (response.status === 'connected') {          
                var uid = response.authResponse.userID;
                var accessToken = response.authResponse.accessToken;
                FB.login(function () {
                    FB.api('/me', {
                            fields: 'id'
                        }, function (response) {
                            console.log(response);
                        });
                }, {
                    scope: 'publish_actions'
                });
            } else if (response.status === 'not_authorized') {

            } else {

            }
        });

    };


    (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'));

    </script>
    <div id="fb-root"></div>
<?php
//here url to go to my app
echo "<a href='...'>Sign in to Facebook application</a>";

if ($session) {
    echo "<br/>logged in";
}
?>

    </body>
</html>

请注意,如果未设置Cookie,则在第二次访问页面后登录。因此需要ajax请求才能正确检查。

相关问题