Facebook iFrame canvas app PHP会话问题

时间:2012-04-11 11:39:52

标签: facebook internet-explorer session iframe safari

我已经在最后一天半的时间里解决了一个问题,现在还没有找到解决方案。

当我在facebook上访问我的游戏时(在facebook的iFrame中),PHP会话无效。这适用于IE和Safari。 Chrome工作正常。

我已经阅读了有关此问题的堆栈上的所有帖子,这似乎取决于第三方Cookie安全性,并且需要首先与iFrame进行交互。有一种解决方法是让javascript首先将一些表单数据发布到iFrame,但这似乎已经在最新版本的浏览器中被“修复”,因为它不再有效。

我甚至尝试实现一个起始页面,要求他们首先点击一个链接(在iFrame中)以加载另一个页面然后创建会话。但即使这样也行不通。

我甚至无法使用javascript在iFrame中加载新页面,这似乎总是会导致无限循环刷新。

不,P3P标题不解决它。

有没有人能解决这个问题?考虑到有多少Facebook应用程序存在,我不能成为唯一拥有它的人!

2 个答案:

答案 0 :(得分:5)

我使用禁用“接受第三方Cookie”的客户端遇到此问题。我的解决方案是强制PHP将会话ID嵌入到URI中,方法是将此行放在每个页面的开头:

ini_set('session.use_trans_sid', true);

由于网址位于Facebook内的iframe中,因此顶部窗口中未显示SID。

答案 1 :(得分:3)

对于IE,您需要设置P3P标头。类似的东西:

<?php header('P3P: CP="CAO PSA OUR"'); ?>

Safari默认阻止第三方Cookie。目前,唯一适合我的解决方法是“弹出”一个新窗口来设置cookie。我有这样的事情:

<script type="text/javascript">
    function safariFix(){
        if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1){
            window.open('https://yourdomainname.com/safari.php', 'Safari Fix','width=100,height=100');
        }
    }
</script>

safari.php 会有这个:

<?php 
setcookie("safari_test", "1");
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Safari Fix</title>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
    </head>
    <script type="text/javascript">
    $(document).ready(function(){
        window.close();
    });
    </script>
    <body>
        Since Safari does not accept third-party cookies by default, we are forced to open this window.
        This window will automatically close once we have set the cookies.
    </body>
</html>

问题:如果用户在Safari中启用了“阻止弹出式窗口”,则无效。如果有人有更好的解决方案,请通知我;)