【问题标题】:Session in Laravel does not work inside the Facebook Application IframeLaravel 中的会话在 Facebook 应用程序 iframe 中不起作用
【发布时间】:2013-02-06 10:34:14
【问题描述】:

我有一个在 iframe 中运行的 facebook 应用程序。在用户允许来自应用程序的权限后,我希望 facebook 向我发送 $_REQUEST 变量,我使用这些变量来检索用户数据并且它运​​行良好。问题是在我使用Session::put()Session::save() 将用户数据放入 Laravel Session 之后,在下一个请求时会话就消失了。所以我的应用程序无法再检索会话。我真的不知道为什么在测试期间我所有的浏览器都可以工作,(Safari, Firefox, Chrome)。因此,每次出现会话错误时,我都会进行一些错误检查以向我发送电子邮件,但我仍然每天收到 30 多封电子邮件,告诉Chrome 没有会话,并且一些用户发布了有关应用程序返回错误的帖子。我真的为这个问题苦苦挣扎了好几天。我已经在我的网站上添加了P3P headersfavicon,但仍然无济于事。

这是我的代码:

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 和 File,但仍然出现错误。

【问题讨论】:

  • 也许尝试使用原生 PHP 会话 - 看看是否可行 - 以帮助隔离问题?
  • 附注您使用的是什么会话存储? cookie、数据库、redis 等?
  • 我尝试使用 PHP 默认 $_SESSION 设置它,但它不起作用。我会更新我迄今为止尝试过的问题。

标签: facebook session session-cookies laravel facebook-iframe


【解决方案1】:

这不是 Laravel 的问题。这是一个经典的 Safari/Internet Explorer 3rd 方 cookie 问题。

尝试在谷歌上搜索“safari cookie fix”或在此处查看其中一些问题,例如: Facebook Iframe App with multiple pages in Safari Session Variables not persisting

【讨论】:

    猜你喜欢
    • 2013-12-31
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多