5

我目前正在开发我的第一个 facebook 应用程序。我在将 setExtendedAccessToken() 函数与 FB.Event.subscribe('auth.login') 结合使用时遇到问题。

我的 js 代码如下所示:

window.fbAsyncInit = function() {

    // init the FB JS SDK
    FB.init({
      appId      : 'XXX', // App ID from the App Dashboard
      channelUrl : 'http://domain.tld/app/channel.php', // Channel File for x-domain communication
      frictionlessRequests: true,
      cookie: true, 
      xfbml: true
    });

    FB.Event.subscribe('auth.login', function(response) {
        $('#loginSpinner').show();
        $('#loginFacebook').hide();
        window.location = "http://domain.tld/app/?first_login";
    });      

};

auth.login事件应仅在用户首次登录时触发。这个 PHP 代码也应该只在第一次登录时触发:

// triggers on first login
if (isset($_GET['first_login'])) {
    if ($me) {
        $facebook->setExtendedAccessToken();
        $friends = $facebook->api('/me/friends');
        $friends = $friends['data'];
        if (!empty($friends)) {
        //sql
        }
        $permissions = $facebook->api("/me/permissions");

        if( array_key_exists('publish_actions', $permissions['data'][0]) ) {
            $attachment = array(
                    'message' => 'XXX',
                    'name' => 'XXX - App',
                    'link' => 'http://domain.tld/app/',
                    'description' => 'XXX',
                    'picture'=> 'http://domain.tld/app/img.jpg',
                    'access_token' =>  $facebook->getAccessToken()
            );
            $facebook->api('/me/feed', 'POST', $attachment);

            //sql
        }
    }
    header('Location: http://domain.tld/app/');
    exit;
}

问题是一个无限循环,它总是会调用auth.login,因为setExtendedAccessToken()会破坏当前会话,facebook 会自动将用户登录到我的应用程序。

有没有办法auth.login只触发一次?当我设置setExtendedAccessToken()为评论时

// $facebook->setExtendedAccessToken();

我的网站只按原样重定向用户一次。但我需要为我的应用程序扩展登录。

我之前的问题:我的 WebApp(使用 facebook 登录)让我退出

4

1 回答 1

2

那么你为什么不这样做:

FB.Event.subscribe('auth.login', function(response) {
        //it will only redirect if the token expires in less than 02h13m20s
        if(response && response.authResponse.expiresIn < 8000){
        $('#loginSpinner').show();
        $('#loginFacebook').hide();
        window.location = "http://domain.tld/app/?first_login";
        }
    }); 
于 2013-04-16T12:12:07.130 回答