0

我有一個Facebook應用程序,它通過PHP-SDK向facebook發送內容。在iframe應用程序中的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 url,並附加到該網址的新會話參數,並打破了應用程序。

有什麼我可以做的假裝Facebook「重新加載」或傳遞給瀏覽器地址欄的Ajax /表單動作?在處理每個請求之前,我會檢查用戶是否仍處於活動狀態,這可能是問題所在?

$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>"); 

我應該使用其他方法嗎? 在此先感謝!

回答

0

你真的不應該像處理常規頁面一樣處理ajax調用。通常,如果在ajax進程中發生類似於過期會話的事情,您希望將錯誤代碼發送回主頁面並讓它在頂層處理它。

我猜你從這個ajax請求發回的信息立即被解析爲HTML?這意味着如果您發回<script>top.location=xxx</script>區塊,它將被執行並將瀏覽器重定向到新位置。這可能不是處理事情的最佳方式,但如果redirect_uri設置得適當(整個頁面的URL),它仍然可以工作。因爲getLoginUrl()在ajax頁面內被調用,所以redirect_uri被設置爲那個url,所以在新的授權完成之後,瀏覽器被髮送回(現在在頂層)。因此,儘管可能不是最好的整體結構,但當您處於ajax調用中時,快速解決方法是覆蓋redirect_uri設置,並使其指向父頁而不是它本身。