У меня есть приложение 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, но все же ошибка возникает.
Возможно попробовать с родной PHP сессии - и посмотреть, если это работает - чтобы помочь изолировать проблему? – Laurence
стр. какое хранилище сеансов вы используете? cookie, база данных, redis и т. д.? – Laurence
Я попытался установить его с помощью PHP default $ _SESSION, но он не работает. Я обновляю свой вопрос о том, что я пробовал до сих пор. – Ryan