¡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.
Gracias! Me di cuenta de esto, pero aprecio que publiques la respuesta en caso de que alguien más necesite saberlo. – John
Gran respuesta y tutorial. –