2014-11-08 15 views
0

我正在为移动设备创建Facebook应用程序。这样的应用程序显示在移动浏览器中,不像在iframe中保存的Facebook画布页面。FacebookJavaScriptLoginHelper无法在第一页刷新时验证用户

我使用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.statusFB.getLoginStatus'unknown'。用户不是 登录。

我去第二个选项卡,重新登录Facebook的,并与我的应用程序刷新第一个标签。其结果是不正确的,但只在第一刷新:

  • FacebookSession仍然是NULL,即使
  • FB.getLoginStatusresponse.status'connected'

在第一刷新这背后的原因失败似乎是显而易见:在刷新Facebook cookie之前,重新加载页面PHP SDK被触发。但是,当用户注销时,它永远不会出现问题 - 在这种情况下,按照预期即时更新FacebookSession

当用户登录到Facebook时,它如何不起作用?

回答

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的服务器

+0

我一定会尝试。谢谢! – lesssugar 2014-11-14 16:55:36