2011-03-16 9 views
11

Por lo tanto, estoy usando un iFrame en mi pestaña y estoy haciendo uno de esos "bloqueos" en los que el usuario necesita que la página le guste para ver el contenido secreto. ¿Hay una manera mejor y más perfecta de hacer esto luego de tener que pedir permiso?Forma transparente de verificar si el usuario le gusta la página

Sé de pestañas construidas con FBML, no piden permiso, pero supongo que es porque NO es un iframe.

Gracias!

Respuesta

20

¡Por supuesto que puede! Como se mencionó en el documentation, Facebook te enviará algunos detalles adicionales en el signed_request:

Cuando un usuario navega a la página de Facebook , verán su página de la ficha añadió en el posición siguiente pestaña disponible. En general, una pestaña de página es cargada exactamente de la misma manera que una página de lienzo . Cuando un usuario selecciona su pestaña de página , recibirá el parámetro signed_request con un parámetro adicional , página. Este parámetro contiene un objeto JSON con una identificación (el id. De página de la página actual ), administrador (si el usuario es un administrador de la página) y le ha gustado (si al usuario le ha gustado la página). Al igual que con una página de Canvas , no recibirá toda la información de usuario de accesible en su aplicación en la solicitud con signo hasta que el usuario autorice su aplicación.

El código tomado de mi tutorial debería ser algo como:

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

código actualizado: Mientras que el código anterior funcionaría. No estaba marcando la validez de la solicitud. Esto significa que alguien podría alterar la solicitud y enviarle información falsa (como configurar admin en true!). El código se ha actualizado siguiendo el enfoque signed_request documentation.

+1

Gracias! Me di cuenta de esto, pero aprecio que publiques la respuesta en caso de que alguien más necesite saberlo. – John

+0

Gran respuesta y tutorial. –

Cuestiones relacionadas