2013-02-20 4 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 получает ошибку API в методе getAccessTokenFromCode. $access_token_response переменная:

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

PHP SDK занимает code значение из COOKIE. Проблема в том, что fbsr_{app_id} не сбрасывается, и он все еще содержит тот же код. И в этом причина бесконечного цикла.

Что я могу сделать для решения этой проблемы. Я думал об удалении fbsr_{app_id} cookie, но это выглядит странно. Почему SDK не обрабатывает это для меня?

+1

Я знаю, что вы нашли обходной путь для этой старой проблемы, но это определенно проблема. Даже после удаления этого файла cookie JS SDK все еще генерирует signed_request с ранее использованным кодом. Я сохраняю смысл создавать воспроизводимый сценарий и сообщать об этом в качестве ошибки. Просто наткнулся на него в 11-м часе попытки получить приложение, нажатое вживую. – rmarscher

ответ

0

Если вы используете PHP 5.4, я столкнулся с этой проблемой. Я написал tutorial о том, как исправить проблему. Причина в том, что PHP SDK не правильно подбирал код.

Вы также можете попытаться уничтожить сеанс (session_destroy() или эквивалент Framework) или вручную очистить файлы cookie (setcookie ("cookie_name", "", time() - 3600);), если получено исключение.

EDIT:

Убедитесь, что ID приложения и App Secret в приложении правильно тоже. Некорректная тайна приложения иногда возникает, поскольку она используется для декодирования signed_request.

Кроме того, если проблема специфична для IE, попробуйте добавить следующий заголовок к коду:

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

настройки безопасности в IE иногда предотвратить печенье от установки в плавающие фреймы. Этот заголовок должен помочь.

+0

Я использую PHP 5.3.5. Проблема здесь в том, что cookie содержит signed_request, поскольку он не изменяется. – keepkimi

+0

Конкретно для браузера, который вы используете? –

0

ОК, я думаю, что нашел обходное решение. Я использую PHP SDK и JS SDK. Я использовал следующий код для перенаправления:

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

Но я добавил JS SDK к нему и проблема не возникает больше:

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; 

Я не уверен, если это не ошибка в JS SDK/PHP SDK.

Смежные вопросы