0

AJAX 기반의 앱 없음 활성 액세스 토큰 없습니다 :내가 2 개 파일과 응용 프로그램 개발입니다

  1. 의 index.php (응용 프로그램 컨테이너)
  2. process.php은 (아약스 호출)

index.php를

<?php 
    include 'config.php'; 
    include 'lib/functions.php'; 
    require_once 'lib/sdk/facebook.php'; 

    $facebook = new Facebook(array(
     'appId' => APP_ID, 
     'secret' => SECRET 
    )); 

    $userID = $facebook->getUser(); 

    if (!$userID) 
    { 
     $scope = 'read_stream, publish_stream, user_likes, user_photos, user_status, friends_hometown, friends_location, friends_likes, photo_upload'; 

     $params = array(
      'scope'  => $scope, 
      'redirect_uri' => "https://apps.facebook.com/".APP_NAME."/" 
     ); 

     $loginUrl = $facebook->getLoginUrl($params); 
    } 
    else 
    { 
     $access_token = $facebook->getAccessToken(); 
    } 
?> 
<!doctype html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <head> 
     <title>Facebook App</title> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <link href="/css/style.css" rel="stylesheet" type="text/css" media="screen" /> 
     <script type="text/javascript" src="/js/jquery.js"></script> 
    </head> 

    <body style="margin:0 !important; padding: 0 !important;"> 

     { SOME HTML } 

     <script type="text/javascript"> 
      function loadData() 
      { 
        $.ajax({ 
         url: "process.php", 
         type: 'POST', 
         cache: false, 
         data: { 
          id_sessione: function(){return $("#id_sessione").val();} 
         }, 
         dataType: "json", 
         success: function(data) { 
          if (data.status == "FAILURE") 
           alert('failure'); 
          else 
           console.log(data); 
         } 
        }); 
      } 




      /********* INIT ********/ 
      $(document).ready(function(){ 
       if ($("#userID").val() != "0") 
        loadData(); 
       else 
        top.location = '<?php echo $loginUrl; ?>'; 
      }); 
     </script> 

     <input id="id_sessione" type="hidden" value="<?php echo session_id(); ?>" /> 
     <input id="userID" type="hidden" value="<?php echo $userID; ?>" /> 

     <div id="fb-root"></div> 
     <script type="text/javascript"> 
      window.fbAsyncInit = function() { 
       FB.init({ 
         appId: '<?php echo APP_ID; ?>', 
         frictionlessRequests: true 
       }); 

       FB.Canvas.setAutoResize(7); 
      }; 

      (function() { 
       var e = document.createElement('script'); 
       e.async = true; 
       e.src = document.location.protocol + 
        '//connect.facebook.net/it_IT/all.js'; 
        document.getElementById('fb-root').appendChild(e);    
      }()); 
      </script> 
     </body> 
</html> 

및 process.php

<?php 
    session_id($_POST['id_sessione']); 
    session_start(); 

    include 'config.php'; 
    include 'lib/functions.php'; 
    require_once 'lib/sdk/facebook.php'; 

    set_time_limit(120); 
    $memory_limit = ini_set('memory_limit', '512M'); 

    try 
    { 
     $facebook = new Facebook(array(
      'appId' => APP_ID, 
      'secret' => SECRET 
     )); 

     $userID = $facebook->getUser(); 

     $user_profile = $facebook->api('/me'); 

     { SOME FQL QUERIES AND DATA PROCESSING } 

     echo json_encode(array(
      'status' => 'SUCCESS', 
      .... other info 
     )); 
    } catch (Exception $e) { 

     $handle = fopen(ROOT_PATH.'/log/'.$userID.'_'.uniqid().'.txt', 'a+') or die('Cannot open file'); 
     fwrite($handle, $e->getMessage()."\n"); 
     fwrite($handle, $e->getTraceAsString()."\n"); 
     fclose($handle); 

     echo json_encode(array(
      'status' => 'FAILURE' 
     )); 
     } 

경우의 95 %에서 애플리케이션이 정상적으로 작동하지만 때로는 $ facebook-> api ('/ me'); "현재 사용자에 대한 정보를 쿼리하는 데 활성 액세스 토큰을 사용해야합니다."이고 $ userID는 0입니다.

시작해야하는 모든 파일에 동일한 세션 ID를 사용하려면 POST에서 index.php에 의해 전달 된 session_id와 수동으로 세션. 이것은 일부 브라우저 (IE, 사파리)가 iframe에서 제 3 자 페이지의 쿠키를 전달하지 않기 때문입니다. (http://stackoverflow.com/questions/9930671/safari-3rd-party-cookie-iframe-trick-no-longer-working)

제안 사항? 감사합니다.

+0

우선 세션 ID가 올바르게 전달되는지 여부를 _checked_ 확인 했습니까? – CBroe

답변

0

세션 값이 제대로 전달되는지 여부를 확인 하시겠습니까?