我在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。
答案 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')
);
答案 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应用程序中执行用户登录和其他需要会话数据的内容。