5

Según Facebook - Authentication within a Canvas Page Document, dicen que obtendremos un signed_request que consiste en un objeto JSON. Ahora dicen que signed_request se puede obtener a través de $_POST['signed_request'] Estoy de acuerdo que está trabajando para mí.cómo leer facebook signed_request para obtener user_id

Ahora bien, según si el usuario se registra en i va a obtener un valor objeto JSON como esto: -

{ 
    "expires":UNIXTIME_WHEN_ACCESS_TOKEN_EXPIRES, 
    "algorithm":"HMAC-SHA256", 
    "issued_at":UNIXTIME_WHEN_REQUEST_WAS_ISSUED, 
    "oauth_token":"USER_ACCESS_TOKEN", 
    "user_id":"USER_ID", 
    "user":{ 
    "country":"ISO_COUNTRY_CODE", 
    "locale":"ISO_LOCALE_CODE", 
    ... 
    } 
} 

ahora quiero buscar el user_id de esto, así que estoy usando esta pieza de código, pero no su trabajo: -

if(isset($_POST['signed_request'])) 
{ 
    echo 'YES'; 
    $json = $_POST['signed_request']; 
    $obj = json_decode($json); 
    print $obj->{'user_id'};  
} 

Sólo imprimir el YES. ¿Por que es esto entonces?

He leído en alguna parte que sin la autenticación de la aplicación no podré extraer el user_id pero de acuerdo con el facebook, este es el primer paso y la autenticación de la aplicación sería el 4to. Soy nuevo en esto, si alguien puede ayudarme, será de gran ayuda. Gracias.

+0

Si haces un 'print_r ($ _ POST)', ¿qué ves? – Brad

+0

¿Qué es lo que realmente ve cuando prueba 'print_r ($ _ POST)'? – Brad

+0

@Brad cuando 'print_r ($ _POST [ 'signed_request']);' me sale exactamente este valor 'cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-K1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf aWQiOiIxNTc2NDU1NjQ5In0' –

Respuesta

2

Creo que falló en json_decode($json) porque $json no es una cadena json válida, como ha mencionado en el comentario sobre print_r($_POST['signed_request']);.

Según Facebook - Authentication within a Canvas Page Document, el parámetro signed_request se codifica y, parsing la cadena signed_request rendirá un objeto JSON.

si está utilizando el PHP SDK, tal como lo dijo Abhishek en el comentario, $facebook->getSignedRequest(); le dará el json decodificado.

mirada here para más detalles sobre la solicitud firmada

+0

Hola, puedo obtener' la url' con app_id en el iframe para abrir en la pestaña de Facebook –

6

Si no desea trabajar con el SDK FB puede utilizar este fragmento de código para obtener el user_id y otras variables (fragmento de https://developers.facebook.com/docs/facebook-login/using-login-with-games/)

function parse_signed_request($signed_request) { 
    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); 

    // confirm the signature 
    $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, '-_', '+/')); 
} 
-1

puede utilizar mi servicio

Modo de empleo: solo use una solicitud jsonp a este

https://websta.me/fbappservice/parseSignedRequest/<append signed request here> 

si el éxito se volverá algo como esto

{ 
"algorithm": "HMAC-SHA256", 
"issued_at": xxxxx, 
"page": { 
    "id": "xxxxxxx", 
    "admin": true, 
    "liked": false 
}, 
"user": { 
    "country": "jp", 
    "locale": "en_US", 
    "age": { 
     "min": xx 
    } 
} 

si no es la salida:

Bad signed Json Signature 

de codificación feliz !!

3

Publicación anterior Sé pero quería agregar una respuesta a la respuesta de Art Geigel (no puedo comentar directamente sobre ella).

el fragmento de código no se encuentra la línea,

$secret = "appsecret"; // Use your app secret here 

y el fragmento completo,

function parse_signed_request($signed_request) { 
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

    $secret = "appsecret"; // Use your app secret here 

    // decode the data 
    $sig = base64_url_decode($encoded_sig); 
    $data = json_decode(base64_url_decode($payload), true); 

    // confirm the signature 
    $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, '-_', '+/')); 
} 

Para responder a la pregunta original

Para obtener datos del signed_request, incluirá las funciones anteriores y ...

$data = parse_signed_request($_POST['signed_request']); 

echo '<pre>'; 
print_r($data); 
Cuestiones relacionadas