CakePHP会话在Facebook上的页面之间的Safari和IE中丢失

时间:2014-06-24 12:32:18

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

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

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

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

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

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

真的很感激任何帮助,thnx。

2 个答案:

答案 0 :(得分:1)

这是您可以从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

答案 1 :(得分:0)

我找到了解决方案。问题是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应用程序中执行用户登录和其他需要会话数据的内容。