1

iframe 内で実行される Facebook アプリがあります。ユーザーがアプリからのアクセス許可を許可した後、Facebook がユーザー データの取得に使用する $_REQUEST 変数を送信することを期待していますが、うまく機能しています。問題は、ユーザー データを Laravel セッションに入れ、 Session::put()次に を使用した後Session::save()、次のリクエストでセッションがなくなったことです。したがって、私のアプリはもうセッションを取得できません。テスト中にすべてのブラウザが動作する理由が本当にわかりません(Safari, Firefox, Chrome). そのため、セッションエラーが発生するたびにエラーチェックをメールで送信しましたが、セッションがないことを伝えるメールを1日あたり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() と関係があるのではないかと疑っています。PS Cookieとファイルを使用するようにLaravelを構成しようとしましたが、それでもエラーが発生します。

4

1 に答える 1

0

これは Laravel の問題ではありません。これは、従来の Safari/Internet Explorer サードパーティ Cookie の問題です。

「Safari Cookie の修正」をグーグルで検索するか、たとえば、ここでいくつかの質問を確認してください: Facebook Iframe App with multiple pages in Safari Session Variables not persisting

于 2014-08-27T09:04:34.547 に答える