FacebookJavaScriptLoginHelper无法在首页刷新时对用户进行身份验证

时间:2014-11-08 14:02:32

标签: facebook facebook-javascript-sdk facebook-php-sdk

我正在为移动设备创建一个Facebook应用程序。此类应用程序显示在移动浏览器中,而不像在iframe中保存的Facebook画布页面。

我正在使用JS和PHP SDK的混合来授权和验证用户。用户需要已登录Facebook才能使用我的应用程序。如果没有,他们需要使用Facebook登录按钮登录。作为JS和PHP SDK之间的桥梁,我正在使用FacebookJavaScriptLoginHelper

我的Facebook.php库的一部分正在完成这项工作:

<?php

    // Initialize the SDK
    FacebookSession::setDefaultApplication($this->app_id, $this->app_secret);

    // Create the login helper
    $this->helper = new FacebookJavaScriptLoginHelper();

    try {
        $this->session = $this->helper->getSession();
    } catch(FacebookRequestException $ex) {
        // When Facebook returns an error
    } catch(Exception $ex) {
        // When validation fails or other local issues
    }
    if ($this->session) {
      // User logged in
      $this->session = new FacebookSession($this->session->getToken());
    }

?>

Facebook JS init:

<script type="text/javascript">

    window.fbAsyncInit = function() {
        FB.init({
            appId: '{my app id}',            
            status: true,
            xfbml: true,
            cookie: true
        });
    }

    FB.getLoginStatus(function(response) {
        console.dir(response);
    });

</script>

上面的代码工作正常,但是当它失败时有一个特定的情况。假设我在浏览器中打开了两个选项卡:在第一个选项卡中我打开了我的应用程序,在第二个选项卡中 - 我已登录Facebook。可以采用两种方案:

我退出Facebook 并使用我的应用刷新标签页。结果是正确的:

  • FacebookSessionNULL
  • 来自response.status
  • FB.getLoginStatus'unknown'。用户不是 登录。

我转到第二个标签,重新登录Facebook 并使用我的应用刷新第一个标签。结果不正确,但仅限于第一次刷新:

  • FacebookSession仍为NULL,即使
  • response.status的{​​li> FB.getLoginStatus'connected'

第一次刷新失败的原因似乎是显而易见的:在重新加载页面的那一刻,PHP SDK在Facebook cookie刷新之前被触发。但是,当用户注销时,它永远不会成为问题 - 在这种情况下,不知怎的FacebookSession会立即更新,如预期的那样。

当用户登录Facebook时,它怎么会不一样?

1 个答案:

答案 0 :(得分:2)

这有帮助吗?

  

对FB.getLoginStatus的后续调用将从此缓存的响应中返回数据。这可能会导致用户自上次完整会话查询以来登录(或退出)Facebook的问题,或者用户已在其帐户设置中删除了您的应用程序。

     

要解决此问题,请调用FB.getLoginStatus,并将第二个参数设置为true以强制向Facebook进行往返 - 有效刷新响应对象的缓存。

FB.getLoginStatus(function(response) {
  // this will be called when the roundtrip to Facebook has completed
}, true);

来源:https://developers.facebook.com/docs/reference/javascript/FB.getLoginStatus

部分:到Facebook服务器的往返