我有一个在iframe中运行的Facebook应用。在用户允许来自应用程序的权限后,我期待facebook向我发送$ _REQUEST变量,我用它来检索用户数据并且它运行良好。问题是我使用Session::put()
然后Session::save()
将用户数据放入Laravel会话后,在下一个请求中,会话消失了。所以我的应用程序无法再检索会话。我真的不知道为什么在测试期间我的所有浏览器都可以运行(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()有关。 附:我已经尝试过将Laravel配置为使用Cookie和文件,但仍然会发生错误。
答案 0 :(得分:0)
这不是Laravel问题。这是一个典型的Safari / Internet Explorer第三方cookie问题。
尝试谷歌搜索&#34; safari cookie fix&#34;或者在这里查看其中的一些问题,例如: Facebook Iframe App with multiple pages in Safari Session Variables not persisting