iframe应用程序中的Facebook会话会破坏ajax调用

时间:2011-09-21 17:22:35

标签: facebook session iframe facebook-graph-api facebook-php-sdk

我有一个facebook应用程序,它通过PHP-SDK连接到facebook。

    $facebook = new Facebook(array(
      'appId'  => FACEBOOK_APP_ID,
      'secret' => FACEBOOK_SECRET_KEY,
    ));

    $user = $facebook->getUser();
    if ($user) {
       try {
            $user_profile = $facebook->api('/me');
       } catch (FacebookApiException $e) {
            error_log($e);
            $user = null;
       }
     }

一切都很好,我让浏览器打开,不响应我的应用程序。过了一会儿,我尝试通过ajax在应用程序中发送表单。会议似乎无效? Facebook将授权我的应用再次将ajax网址加载到浏览器地址栏中,并将新会话参数附加到该网址并打破该应用。

有什么办法可以假装Facebook“重新加载”或将ajax / form动作传递给浏览器地址栏吗?在处理每个请求之前,我会检查用户是否仍处于活动状态,这可能是问题吗?

   $user = $facebook->getUser();
   if ($user != 0) {
       if($this->userProfile == null){
           try {
               // Proceed knowing you have a logged in user who's authenticated.
               $this->userProfile = $facebook->api('/me');
           } catch (FacebookApiException $e) {
               error_log($e);
               $user = null;
           }
       }
   }else{
       $this->userProfile = null;
   }

   if ($this->userProfile != null) {
       $filterChain->run();
   } else {
       $loginUrl = $facebook->getLoginUrl(
       array('scope' => 'publish_stream','redirect_uri' => 'REDIRECT_URI'));
   }

   echo("<script> top.location.href='" . $loginUrl . "'</script>");

我应该使用其他approch吗? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

你真的不应该像常规页面提取一样处理ajax调用。通常,如果在ajax进程中发生类似过期的会话,则需要将错误代码发送回主页并让它在顶层处理它。

我猜你从这个ajax请求发回的信息会立即被解析为HTML吗?这意味着如果您发回<script>top.location=xxx</script>块,它将被执行并将浏览器重定向到新位置。同样,这可能不是处理事情的最佳方式,但如果redirect_uri设置得当(作为整体的页面的url),它仍然可以工作。因为getLoginUrl()在ajax页面中被调用,所以redirect_uri被设置为该url,所以在新的授权完成后,浏览器被发送回去(现在在顶层)。因此,虽然可能不是最好的整体结构,但是当您在ajax调用中时,快速解决方法是覆盖redirect_uri设置,并使其指向父页面而不是自身。