2013-02-20 75 views
1

我试图让用户页面:Facebook的signed_request饼干坚持错误的代码

<?php 
try { 
    $pages = $facebook->api('/me/accounts?fields=id,name'); 
    if (isset($pages['data'])) { 
     $this->assign('pages', $pages['data']); 
     $this->pages = $pages['data']; 
    } 
} catch (\FacebookApiException $e) { 
    $loginUrl = $facebook->getLoginUrl(
     array(
      'redirect_uri' => $this->container->getParameter('home_url'), 
      'scope'  => 'email,manage_pages' 
     ) 
    ); 
    echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>'; 
    exit; 
} 

但我跳进无尽的重定向循环。经过一番研究,我发现PHP SDK GET是从API的错误getAccessTokenFromCode方法。 $access_token_response变量是:

{"error":{"message":"This authorization code has expired.","type":"OAuthException","code":100}} 

PHP SDK需要从COOKIE code值。问题是fbsr_{app_id}未刷新,并且它仍包含相同的代码。这就是无限循环的原因。

我能做些什么来解决这个问题。我正在考虑删除fbsr_{app_id} Cookie,但看起来很奇怪。为什么SDK不为我处理?

+1

我知道你找到了解决这个老问题的方法,但这绝对是一个问题。即使在删除该cookie后,JS SDK仍然会生成一个带有先前使用的代码的signed_request。我保留意义,创造一个可重现的场景并向他们报告错误。刚刚在尝试推送应用程序的第11个小时中遇到它。 – rmarscher 2013-09-20 20:55:33

回答

0

如果你使用PHP 5.4,我就遇到了这个问题了。我写了一篇关于如何解决这个问题的tutorial。原因是PHP SDK没有正确地获取代码。

如果收到异常,您也可以尝试销毁会话(session_destroy()或Framework等效项)或手动清除Cookie(setcookie ("cookie_name", "", time() - 3600);)。

编辑

确保应用程序ID和App秘密的应用是正确的了。不正确的应用程序的秘密有时是问题,因为它是用来给signed_request解码。

而且,如果问题是特定于IE,尝试添加下面的标头代码:

header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'); 

IE的安全设置有时会阻止从饼干I帧设置英寸上面的标题应该有所帮助。

+0

我使用PHP 5.3.5。这里的问题是包含signed_request的cookie,因为它不会改变。 – keepkimi 2013-02-20 13:24:26

+0

是否特定于您正在使用的浏览器? – 2013-02-20 13:28:19

0

OK,我想我找到了解决办法。我正在使用PHP SDK和JS SDK。我用下面的代码重定向:

echo '<script type="text/javascript">top.location.href = "'.$loginUrl.'";</script>'; 
exit; 

我又补充JS SDK它并不会再出现问题:如果不是JS SDK/PHP的错误

echo " 
<div id=\"fb-root\"></div> 
<script type=\"text/javascript\"> 
    window.fbAsyncInit = function() { 
    FB.init({appId: ".$app_id.", status: true, cookie: true, xfbml: true, oauth: true}); 
    FB.getLoginStatus(function(response) { 
     top.location.href = '".$loginUrl."'; 
    }); 
    }; 
    (function() { 
    var e = document.createElement('script'); e.async = true; 
    e.src = document.location.protocol + 
     '//connect.facebook.net/en_US/all.js'; 
    document.getElementById('fb-root').appendChild(e); 
    }()); 
</script> 
"; 
exit; 

我不知道SDK。