2013-02-21 2 views
0

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

Вот мой код:

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'); 
} 

EDIT

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

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

<?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>'; 

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

+0

Возможно попробовать с родной PHP сессии - и посмотреть, если это работает - чтобы помочь изолировать проблему? – Laurence

+0

стр. какое хранилище сеансов вы используете? cookie, база данных, redis и т. д.? – Laurence

+0

Я попытался установить его с помощью PHP default $ _SESSION, но он не работает. Я обновляю свой вопрос о том, что я пробовал до сих пор. – Ryan

ответ