Сеанс Facebook в приложении iframe прерывает вызовы ajax - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть приложение facebook, которое подключается к Facebook через PHP-SDK.

    $facebook = new Facebook(array(
      'appId'  => FACEBOOK_APP_ID,
      'secret' => FACEBOOK_SECRET_KEY,
    ));

    $user = $facebook->getUser();
    if ($user) {
       try {
            $user_profile = $facebook->api('/me');
       } catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
       }
     }

Все хорошо, я открываю браузер и не отвечаю на мое приложение.Через некоторое время я пытаюсь отправить форму в приложении через ajax.Кажется, сессия недействительна?Facebook снова авторизует мое приложение, загружает URL-адрес ajax в адресную строку браузера и присоединяет новый параметр сеанса к этому URL-адресу и прерывает работу приложения.

Могу ли я что-нибудь сделать, чтобы притвориться, что Facebook «перезагрузил» или прошелдействие ajax / form в адресной строке браузера?Перед обработкой каждого запроса я проверяю, активен ли пользователь или нет, в этом может быть проблема?

   $user = $facebook->getUser();
   if ($user != 0) {
       if($this->userProfile == null){
           try {
               // Proceed knowing you have a logged in user who's authenticated.
               $this->userProfile = $facebook->api('/me');
           } catch (FacebookApiException $e) {
               error_log($e);
               $user = null;
           }
       }
   }else{
       $this->userProfile = null;
   }

   if ($this->userProfile != null) {
       $filterChain->run();
   } else {
       $loginUrl = $facebook->getLoginUrl(
       array('scope' => 'publish_stream','redirect_uri' => 'REDIRECT_URI'));
   }

   echo("<script> top.location.href='" . $loginUrl . "'</script>");

Стоит ли использовать другой подход?Заранее спасибо!

1 Ответ

0 голосов
/ 21 сентября 2011

Вы действительно не должны обрабатывать ajax-вызовы так же, как обычные выборки страниц.Обычно, если в процессе ajax происходит что-то вроде сеанса с истекшим сроком действия, вы хотите отправить код ошибки обратно на главную страницу и позволить ему обработать его на верхнем уровне.

Я предполагаю, что информация, которую вы отправляете обратноиз этого ajax-запроса сразу же разбирается как HTML?Это означает, что если вы отправите обратно блок <script>top.location=xxx</script>, он будет выполнен и перенаправит браузер на новое место.Опять же, это, вероятно, не лучший способ справиться с ситуацией, но он все равно работал бы, если бы redirect_uri был установлен соответствующим образом (для URL-адреса страницы в целом).Поскольку getLoginUrl () вызывается в то время как внутри страницы ajax, вместо этого для redirect_uri устанавливается этот URL-адрес, поэтому после завершения новой авторизации именно туда отправляется браузер (теперь на верхнем уровне).Поэтому, хотя, возможно, и не самая лучшая общая структура, быстрым обходным решением было бы переопределить параметр redirect_uri, когда вы находитесь в вызове ajax, и сделать так, чтобы он указывал на родительскую страницу, а не на себя.

...