1

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

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

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

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

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

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

4

2 回答 2

0

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

于 2014-06-24T12:40:16.207 回答
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 应用程序中进行用户登录和其他需要会话数据的操作。

于 2014-06-25T08:45:32.247 回答