2011-03-16 8 views
11

Quindi, sto usando un iFrame nella mia scheda e sto facendo uno di quei "roadblock" in cui l'utente deve gradire la pagina per poter visualizzare il contenuto segreto. C'è un modo migliore e più semplice per farlo, quindi dover chiedere il permesso?Modo semplice per verificare se la pagina degli utenti piace

Conosco le schede create con FBML, non chiedono il permesso, ma suppongo che sia perché NON è un iframe.

Grazie!

risposta

20

Certo che puoi! Come accennato nella documentation, Facebook ti invierà alcuni dettagli in più nel signed_request:

Quando un utente accede alla pagina di Facebook , vedranno la vostra linguetta della pagina aggiunto nella prossima scheda disponibile posizione. In generale, una scheda Pagina è caricata esattamente nello stesso modo di una pagina Canvas . Quando un utente seleziona la tua scheda Pagina , riceverai il parametro firmato_request con un parametro aggiuntivo , pagina. Questo parametro contiene un oggetto JSON con ID un id (l'ID di pagina della pagina corrente ), admin (se l'utente è un amministratore della pagina) e ha gradito (se l'utente ha apprezzato la pagina). Come con una pagina Canvas , non riceverai tutte le informazioni utente accessibili nella tua app nella richiesta firmata fino a quando l'utente autorizza la tua app.

Il codice preso dal mio tutorial dovrebbe essere qualcosa di simile:

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

AGGIORNAMENTO CODICE: Mentre il codice precedente avrebbe funzionato. Non ero controllo la validità della richiesta. Ciò significa che qualcuno potrebbe manomettere la richiesta e inviarti informazioni false (come l'impostazione di admin a true!). Il codice è stato aggiornato, seguendo l'approccio signed_request documentation.

+1

Grazie! L'ho capito, ma apprezzo che tu invii la risposta nel caso che qualcun altro abbia bisogno di sapere. – John

+0

Ottima risposta e tutorial. –

Problemi correlati