2011-03-16 8 views
11

私は自分のタブにiFrameを使用しています。私は秘密のコンテンツを見るためにページを好きにする必要がある "ロードブロッキング"のようなものをやっています。許可を求める必要がなくなり、これを行うためのよりシームレスな方法がありますか?ユーザーがページを好きかどうかをチェックするシームレスな方法

私はFBMLで構築されたタブを知っていますが、彼らは許可を求めるのではありませんが、iframeではないので、そのことを推測しています。

ありがとうございます!

答えて

20

もちろん可能です! documentationで述べたように、Facebookはsigned_requestにあなたにいくつかの余分な詳細をお送りします:

ユーザーがFacebookの ページに移動し、彼らはあなたのページのタブ は、次の利用可能なタブ 位置に追加表示されます。概して、ページタブは、 キャンバスページとまったく同じ方法でロードされた です。ユーザーが ページタブを選択すると、 追加パラメータpageの1つを使用して signed_requestパラメータが送信されます。この パラメータには、id(現在の ページのページID)、admin(ユーザーがページの の場合はadmin)、好きな場合( のページが好きだった場合)の というJSONオブジェクトが含まれています。 Canvas ページの場合と同様に、 ユーザーがあなたのアプリを承認するまで、 ユーザーの情報は のアプリケーションでsigned_requestにアクセスできません。

ように私のtutorialあるべき何かから取らコード:

<?php 
if(empty($_REQUEST["signed_request"])) { 
    // no signed request where found which means 
    // 1- this page was not accessed through a Facebook page tab 
    // 2- a redirection was made, so the request is lost 
    echo "signed_request was not found!"; 
} else { 
    $app_secret = "APP_SECRET"; 
    $data = parse_signed_request($_REQUEST["signed_request"], $app_secret); 
    if (empty($data["page"]["liked"])) { 
     echo "You are not a fan!"; 
    } else { 
     echo "Welcome back fan!"; 
    } 
} 

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, '-_', '+/')); 
} 
?> 

更新されたコード:前のコードが動作するだろうが。私はであり、の要求の有効性をチェックしていませんでした。これは、誰かがリクエストを改ざんして偽の情報を送信する可能性があることを意味します(trueに設定するなど)。コードはsigned_request documentationの方法で更新されました。

+1

ありがとうございます!私はこれを理解しましたが、他の誰かが知る必要がある場合に備えて回答を投稿していただきありがとうございます。 – John

+0

偉大な答えとチュートリアル。 –

関連する問題