Сессия в Laravel не работает внутри iframe приложения Facebook

У меня есть приложение facebook, которое работает внутри iframe. После того, как пользователь разрешит разрешения из приложения, я ожидаю, что facebook отправит мне переменные $ _REQUEST, которые я использую для получения пользовательских данных, и он работает хорошо. Проблема в том, что после того, как я поместил данные пользователей в сеанс Laravel, используя Session::put(), а затем Session::save(), при следующем запросе сеанс исчезнет. Итак, мое приложение больше не может получать сеанс. Я действительно не знаю, почему во время теста все мои браузеры работают (Safari, Firefox, Chrome). Поэтому я отправляю некоторую проверку ошибок на электронную почту каждый раз, когда возникает ошибка сеанса, и все же я получаю более 30 писем в день, в которых говорится, что Chrome не имеет сеанса, и некоторые пользователи писали об ошибке, возвращаемой приложением. Я действительно борюсь с этой проблемой уже несколько дней. Я выполнил некоторые исправления, добавив P3P headers и favicon на свой сайт, но все равно безрезультатно.

Вот мой код:

Route::filter('before', function() 
{
    // Do stuff before every request to your application...
    header('P3P:CP="NOI DEV PSAi COM NAV OTR STP DEM HONK IDC DSP COR ADM DEVi TAIi CAO PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');

//safari 3rd party fix cookie fix
if(isset($_SERVER['HTTP_USER_AGENT'])) {
    if (! count($_COOKIE) > 0 && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) {
        if(strpos($_SERVER['HTTP_USER_AGENT'], 'Chrome') == false) {
            session_start();
            $page_url = Config::get('custom.fb_page');
            if (isset($_GET["start_session"]))
                die(header("Location:" . $page_url));
            $sid = session_id();
            if (!isset($_GET["sid"]))
            {
                if(isset($_POST["signed_request"]))
                    $_SESSION["signed_request"] = $_POST["signed_request"];
                die(header("Location:?sid=" . $sid));
            }
            if (empty($sid) || $_GET["sid"] != $sid)
                die('<script>top.window.location="?start_session=true";</script>');
        }
      }
    }
  }
}

// и код, который устанавливает Laravel Session

Route::any('tab/(:any?)', function ($res = null)
{
    //$response = some_function_to_get_token($_REQUEST['signed_request']);
    if($response && isset($response['oauth_token']))
    {
        Session::put('my_session_for_token', $response['oauth_token']);
        Session::save();

        $redirect = Redirect::to('my_awesome_page');
    }
    else
        $redirect = Redirect::to('permission');
}

ИЗМЕНИТЬ

Я уже пробовал установить $ _SESSION и прокомментировать Session :: put (), но он вообще не устанавливает мой $ _SESSION. Следующее, что я попробовал, - это загрузить скрипт sessionchecker.php и попробовать его с помощью браузера.

вот код для проверки сеанса:

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', '1');
    session_start();

    if (isset($_SESSION['views']))
       $_SESSION['views'] = $_SESSION['views'] + 1;
    else
       $_SESSION['views'] = 0;

   echo '<pre>';
   var_dump(session_id()); // I should stay the same
   var_dump($_SESSION); // I should start at 0 and increase
   echo '</pre>';

и он работает, как ожидалось, я подозреваю, что это как-то связано с Redirect :: to (). P.S. Я уже пробовал настроить Laravel для использования Cookie и File, но ошибка все равно возникает.


person Ryan    schedule 21.02.2013    source источник
comment
Возможно, попробуйте использовать собственный сеанс PHP - и посмотрите, работает ли это - чтобы помочь изолировать проблему?   -  person Laurence    schedule 21.02.2013
comment
p.s. какое хранилище сессий вы используете? cookie, база данных, Redis и т. д.?   -  person Laurence    schedule 21.02.2013
comment
Я попытался установить его, используя PHP по умолчанию $ _SESSION, но это не работает. Я обновлю свой вопрос о том, что я пробовал до сих пор.   -  person Ryan    schedule 21.02.2013


Ответы (1)


Это не проблема Laravel. Это классическая проблема сторонних файлов cookie Safari / Internet Explorer.

Попробуйте поискать в Google "исправление файлов cookie сафари" или ответьте на некоторые из этих вопросов здесь, например: Приложение Facebook Iframe с несколькими страницами в Safari, переменные сеанса не сохраняются

person Mārtiņš Briedis    schedule 27.08.2014