2013-02-20 33 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。