2011-04-15 2 views

답변

16

읽는 documentation :

  1. 페이스 북은 항상 page

그래서이라는 signed_request이 페이지가 있다면

  • (캔버스 페이지 URL에 대한), 페이스 북이 추가됩니다 추가 매개 변수를 보낼 것입니다 이를 바탕으로 다음과 같이 할 수 있습니다.

    <?php 
    if(isset($_REQUEST['signed_request'])) { 
        // We are in Canvas or Page now 
    
        // Let's extract the data from the signed_request 
        // to check if we are inside a Facebook Page 
        $app_secret = "APP_SECRET"; 
        $data = parse_signed_request($_REQUEST["signed_request"], $app_secret); 
    
        if(isset($data["page"])) { 
         echo "Page"; 
        } else { 
         echo "Canvas"; 
        } 
    } else { 
        echo "None, or something went wrong!"; 
    } 
    
    function parse_signed_request($signed_request, $secret) { 
        list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
    
        // decode the data 
        $sig = base64_url_decode($encoded_sig); 
        $data = json_decode(base64_url_decode($payload), true); 
    
        if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 
         error_log('Unknown algorithm. Expected HMAC-SHA256'); 
         return null; 
        } 
    
        // check sig 
        $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); 
        if ($sig !== $expected_sig) { 
         error_log('Bad Signed JSON signature!'); 
         return null; 
        } 
    
        return $data; 
    } 
    
    function base64_url_decode($input) { 
        return base64_decode(strtr($input, '-_', '+/')); 
    } 
    
    ?> 
    
  • +0

    이 여전히의 경우 :

    그래서 나는이 코드를 사용하여 종료? 실험 할 때, 사용자가 캔버스 URL에 착륙했을 때만 signed_request가 게시됩니다. 후속 페이지는 가져올 수 없습니다. – dmnc

    +0

    @FuzzyDunlop,이 [답변] (http://facebook.stackoverflow.com/questions/7610408/htacess-redirect-secure-browsing-on-my-facebook-page/7610648#7610648)을 참조하십시오. 'signed_request'를 잃고있는 iframe 내부를 리디렉션하는 대신 최상위 URL ('target = "_ top"을 사용하여)을 수정하도록 URL을 변경하십시오. – ifaour

    +0

    테스트를 거쳤습니다. 나는'signed_request'를 얻는다; 'page' 매개 변수를 감지 할 수 없습니다. 업데이트를 고려해 주시겠습니까? – wpcoder

    0

    나는 또한 웹 사이트를 기준에 추가해야했다. 이것은 내 Yii 코드입니다

    if(empty($_POST['signed_request']) === false) 
         $signedRequest = Yii::app()->fb->getSignedRequest(); 
    
        if(isset($signedRequest['page'])) 
          $this->layout = 'tab';   
    
        else if(isset($signedRequest['user']) && ! isset($signedRequest['page'])) 
         $this->layout = 'canvas'; 
        else 
         $this->layout = 'website'; 
    
    0

    @ifaour 솔루션에 감사드립니다. 작동하도록 수정해야했습니다.

    나를 위해 일한이; 사이트가 캔버스로로드 될 때만 서명 된 요청이 전송된다는 사실을 확인했습니다. 하지만 직접 액세스 할 때는 서명 된 요청이 전송되지 않습니다.

    if(!isset($_SESSION['signed_request']) && empty($_SESSION['signed_request'])) { 
        exit("direct access not allowed."); 
    
    } 
    else 
    { 
        // echo 'Canvas'; 
        // continue script 
    } 
    
    관련 문제