【问题标题】:CakePHP session lost in Safari and IE between pages on FacebookCakePHP 会话在 Facebook 页面之间的 Safari 和 IE 中丢失
【发布时间】:2014-08-14 17:19:11
【问题描述】:

我正在 CakePHP 框架上开发一个 Facebook 应用程序,我正在尝试做一件简单的事情:

// get user
$user = $this->Facebook->api('/me');

// store the user id into session
$this->Session->write('User.id', $user['id']);

但是,一旦我更改页面,Safari 中的会话就会丢失,无论如何我都无法从会话中获取 id。

我在这里找到了许多解决方案,并在其他论坛上尝试了所有解决方案,但我还没有设法解决这个问题。没有什么对我有用,或者我做错了......有人设法找到了一个可行的解决方案吗?

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 我有一个会话(如果我在登录页面上回显它已设置),但如果用户点击应用程序内的另一个页面,该会话将丢失。
  • 好的,这就是我想解决的问题... 为什么我在 Safari 中丢失了会话?我怎么会不失去它!?
  • 会话 id 在 safari 中的每次刷新时都会不断变化。
  • 我检查了日志,没有与应用程序相关的错误。
  • 如果我在 facebook iframe 之外运行应用程序,一切正常。每次重新加载时会话 id 保持不变...但在 facebook iframe id 内部不断变化,并且仅在 Safari 中,在 Firefox 中它可以工作,并且会话 id 在应用程序中保持不变...

标签: facebook session cakephp facebook-php-sdk cakephp-2.5


【解决方案1】:

我找到了解决办法。问题在于 Safari cookie 策略,用户必须更改以允许其 Safari 设置中的所有 cookie。

但我发现,如果我首先在 facebook iframe 外部重新加载页面并在那里设置会话,即使在 facebook iframe 内部,会话也会保持不变。

所以我创建了另一个控制器操作,只是为了启动一个新会话并将其 id 存储在会话中以供以后使用:

public function safari_session_hack()
{
    $app_url = "app_url"; // the full url of your app on facebook
    session_start();
    $this->Session->write('Session.id', session_id());
    die(header("Location:" . $app_url)); // redirect back to the FB app
}

然后在我的 FB 应用登陆页面上我有这个代码:

// Session fix for Safari
if (!$this->Session->read('Session.id') && strpos($_SERVER['HTTP_USER_AGENT'], 'Safari')) {
    echo '<script>top.location.href="' . Router::fullbaseUrl() . Router::url(array('controller' => 'main', 'action' => 'safari_session_hack')) . '"</script>';
    die;
}

它所做的只是检查会话 ID 是否未设置以及浏览器是否为 Safari。然后它重定向到 safari_session_hack() 操作,在外部页面上启动会话,将其 id 保存在会话中并重定向回页面。

现在一切正常,页面之间的会话不会丢失或破坏,因此您可以在 FB 应用程序中进行用户登录和其他需要会话数据的操作。

【讨论】:

    【解决方案2】:

    这是您可以从 github 下载的正确代码

    //Example AppController setup
    public $components = array('Session',
        'Auth' => array(
            'authenticate' => array(
                'Form' => array(
                    'fields' => array('username' => 'email')
                )
            ),
            'authorize' => 'Controller'
        ),
        'Facebook.Connect' => array('model' => 'User')
    );
    

    https://github.com/webtechnick/CakePHP-Facebook-Plugin

    【讨论】:

    • 我尝试了所有这些,甚至做了我自己的自定义 FB 登录功能......即使使用 Auth 并登录用户,当用户转到应用程序中的另一个页面时,会话也会丢失。这仅限于提到的浏览器,在 Firefox 和 Chrome 中它就像一个魅力......
    • 我从 FB SDK 获取用户 ID,会话只是在 Safari 中的页面之间丢失...
    猜你喜欢
    • 2019-04-04
    • 2012-06-15
    • 2011-02-26
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多