用户在Facebook上的持久标志?

时间:2012-02-02 14:34:52

标签: php facebook persistent identification

我正在为我们的主要电子商务网站设计移动网站。由于该站点由不灵活的遗留代码组成,因此我选择查找用户用户代理字符串,并将每个页面请求标识为移动用户。这样就不需要改变url结构。到目前为止,这似乎很有效。

但是,我认为使用这个移动版本可能会有点酷,这样用户就可以通过iframe浏览我们在facebook上的电子商务网站(尺寸非常完美)。但是,与移动浏览器不同,我无法找到将用户识别为Facebook用户的持久方式。我知道facebook会在第一次通过iframe查看页面时发送$ _POST变量,我只需将其存储在会话变量中即可完成。出现的问题是,如果用户访问Facebook,在他们的会话中被标记为Facebook用户,然后访问我们的常规电子商务网站怎么办?好吧,他们仍然被认定为Facebook用户,并获得Facebook版本,这是不理想的。

2 个答案:

答案 0 :(得分:1)

也许您可以从另一个角度解决问题并测试网站是否从框架加载?

这可以使用javascript:

if (top === self) { 
   //not a frame 
} else { 
   //a frame 
}

答案 1 :(得分:0)

不确定回答我自己的问题是否是正确的礼节,但我找到了一个答案,它是Hassou的答案和javascript php检测脚本的组合。

我改变的脚本来自这里: http://snippets.bluejon.co.uk/check4-js-and-cookies/check4-js-enabled-v2-phpcode.php

基本上我的想法是使用javascript来提交引用当前网址的表单,结果会告诉你javascript是否已启用...但是,只有当javascript返回true才能轻松更改提交表单一个iframe。然后,您可以将$ _POST数据传递到表单中,以便继承$ _POST数据(仅在应用程序的显示层中引用$ _POST数据时才需要)。这是基本的想法:

<?php
/* Include head of your application goes here, this should do whatever
session handling code you have and all processing done to the $_POST variables */

// ~~~~~~Full Url Function - Works With Mod_Rewrite~~~~~~~~~ //
// important thing is function will grab all $_GET vars
function fullurlnav()
{
$fullurlsortnav = 'http';
$script_name = '';
  if(isset($_SERVER['REQUEST_URI']))
  {
  $script_name = $_SERVER['REQUEST_URI'];
  }
  else
  {
  $script_name = $_SERVER['PHP_SELF'];
    if($_SERVER['QUERY_STRING']>' ')
    {
    $script_name .=  '?'.$_SERVER['QUERY_STRING'];
    }
  }

  if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on')
  {
  $fullurlsortnav .=  's';
  }

$fullurlsortnav .=  '://';

  if($_SERVER['SERVER_PORT']!='80')
  {
  $fullurlsortnav .=
  $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'].$script_name;
  }
  else
  {
  $fullurlsortnav .=  $_SERVER['HTTP_HOST'].$script_name;
  }

return $fullurlsortnav;
}
// ~~~~~~~~~~~End Full URL Function~~~~~~~~~ //
?>
<html>
<body>
<?php
// Only run this check if user has been identified as a facebook user in their session
// or if they've been identified via the $_POST['signed_request'], which facebook sends
// upon first request via iframe.
// Doing this removes the check when it's unneeded.
if (!isset($_POST['inIframe']) && ( isset($_SESSION['inIframe']) || isset($_POST['signed_request']) ) )
{   
?>
    <form name="postJs" action="<?php echo fullurlnav(); ?>" method="post">
    <input type="hidden" name="inIframe" value="1">
    <?php
    // Carry over $_POST
    foreach($_POST as $key => $value)
    {
    echo '<input type="hidden" value="'.$value.'" name="'.$key.'" />';
    }
    ?>
    </form>
    <script type="text/javascript">
            <!--
          // If in an iframe
          if (top !== self)
          {
          document.postJs.submit();
          }
        //-->
    </script>
  <?php
}
elseif(isset($_POST['inIframe']) && ( isset($_SESSION['inIframe']) || isset($_POST['signed_request']) ) )
{
$_SESSION['inIframe']=1;
}
else
{
$_SESSION['inIframe']=0;
}

if ($_SESSION['inIframe']== 1){
echo 'IS in an Iframe';
}else{
echo 'IS NOT in an Iframe';
}

// echo out rest of your template code
?>
</body>
</html>

在你的页面显示代码输出和它的工作方式有点棘手滑冰,但这是我到目前为止的基本想法。从技术上讲,可以将表单生成块与下面的elseif else语句分开,并在任何显示输出之前使用代码上方的那些,这可能更容易处理。请注意,上述代码未经测试,仅用于为具有相同问题的其他人提供基本思路。