Нет активного токена доступа с приложением на основе ajax

Я разрабатываю приложение с 2 файлами:

  1. index.php (контейнер приложения)
  2. process.php (вызывается в ajax)

index.php

<?php
    include 'config.php';
    include 'lib/functions.php';
    require_once 'lib/sdk/facebook.php';

    $facebook = new Facebook(array(
        'appId'  => APP_ID,
        'secret' => SECRET
    ));

    $userID = $facebook->getUser();

    if (!$userID)
    {
         $scope = 'read_stream, publish_stream, user_likes, user_photos, user_status, friends_hometown, friends_location, friends_likes, photo_upload';

         $params = array(
             'scope'        => $scope,
             'redirect_uri' => "https://apps.facebook.com/".APP_NAME."/"
         );

         $loginUrl = $facebook->getLoginUrl($params);
    }
    else 
    {
        $access_token = $facebook->getAccessToken();
    }
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
    <head>
        <title>Facebook App</title>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <link href="/css/style.css" rel="stylesheet" type="text/css" media="screen" />
        <script type="text/javascript" src="/js/jquery.js"></script>
    </head>

    <body style="margin:0 !important; padding: 0 !important;">

        { SOME HTML }

        <script type="text/javascript">
             function loadData()
             {
                  $.ajax({
                      url: "process.php",
                      type: 'POST',
                      cache: false,
                      data: {
                          id_sessione: function(){return $("#id_sessione").val();}
                      },
                      dataType: "json",
                      success: function(data) {
                          if (data.status == "FAILURE")
                              alert('failure');
                          else
                              console.log(data);
                      }
                  });
             }




             /********* INIT ********/
             $(document).ready(function(){
                 if ($("#userID").val() != "0")
                     loadData();
                 else
                     top.location = '<?php echo $loginUrl; ?>';
             });
         </script>

         <input id="id_sessione" type="hidden" value="<?php echo session_id(); ?>" />
         <input id="userID" type="hidden" value="<?php echo $userID; ?>" />

         <div id="fb-root"></div>
         <script type="text/javascript">
             window.fbAsyncInit = function() {
                 FB.init({
                      appId: '<?php echo APP_ID; ?>',
                      frictionlessRequests: true
                 });

                 FB.Canvas.setAutoResize(7);
             };

             (function() {
                 var e = document.createElement('script');
                 e.async = true;
                 e.src = document.location.protocol +
                     '//connect.facebook.net/it_IT/all.js';
                     document.getElementById('fb-root').appendChild(e);             
             }());
          </script>
      </body>
 </html>

и process.php

<?php
    session_id($_POST['id_sessione']);
    session_start();

    include 'config.php';
    include 'lib/functions.php';
    require_once 'lib/sdk/facebook.php';

    set_time_limit(120);
    $memory_limit = ini_set('memory_limit', '512M');

    try
    {
        $facebook = new Facebook(array(
            'appId'  => APP_ID,
            'secret' => SECRET
        ));

        $userID = $facebook->getUser();

        $user_profile = $facebook->api('/me');

        { SOME FQL QUERIES AND DATA PROCESSING }

        echo json_encode(array(
            'status' => 'SUCCESS',
            .... other info
        ));
     } catch (Exception $e) {

         $handle = fopen(ROOT_PATH.'/log/'.$userID.'_'.uniqid().'.txt', 'a+') or die('Cannot open file');
         fwrite($handle, $e->getMessage()."\n");
         fwrite($handle, $e->getTraceAsString()."\n");
         fclose($handle);

         echo json_encode(array(
             'status'   => 'FAILURE'
         ));
      }

В 95% случаев приложение работает нормально, но иногда $facebook->api('/me'); Выдает исключение "Активный токен доступа должен использоваться для запроса информации о текущем пользователе." и $userID равен 0.

Чтобы иметь одинаковый идентификатор сеанса во всех файлах, я должен начать сеанс вручную с идентификатором сеанса, переданным index.php в POST. Это связано с тем, что некоторые браузеры (IE, Safari) не передают файлы cookie сторонних страниц в iframe. (Http://stackru.com/questions/9930671/safari-3rd-party-cookie-iframe-trick-no-longer-working)

Какие-либо предложения? Спасибо

1 ответ

Проверить, правильно ли передается значение сеанса или нет?