5

Secondo Facebook - Authentication within a Canvas Page Document, dicono che otterremo un signed_request che consiste in un oggetto JSON. Ora dicono che signed_request può essere passato a $_POST['signed_request'] Sono d'accordo sul fatto che funzioni per me.come leggere facebook signed_request per ottenere user_id

Ora, secondo loro, se l'utente è connesso sarò sempre un valore di oggetto JSON in questo modo: -

{ 
    "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", 
    ... 
    } 
} 

Ora voglio prendere la user_id fuori da questo modo che io sto usando questo pezzo di codice, ma la sua non funziona: -

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

E 'solo stampare il YES. Perché è così?

Ho letto da qualche parte che senza l'autenticazione dell'app non sarò in grado di estrarre lo user_id ma secondo facebook, questo è il primo passaggio e l'autenticazione dell'applicazione sarebbe 4a. Sono nuovo, se qualcuno può aiutarmi, sarà di grande aiuto. Grazie.

+0

Se si esegue un 'print_r ($ _ POST)', cosa vedi? – Brad

+0

Cosa vedi quando provi 'print_r ($ _ POST)'? – Brad

+0

@Brad quando i 'print_r ($ _ POST [ 'signed_request']);' ottengo esattamente questo valore 'cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-K1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf aWQiOiIxNTc2NDU1NjQ5In0' –

risposta

2

Penso che non sia riuscito a json_decode($json) perché $json non è una stringa json valida, come hai menzionato nel commento su print_r($_POST['signed_request']);.

Secondo Facebook - Authentication within a Canvas Page Document, il parametro signed_request sono codificate e, parsing stringa signed_request produrrà un oggetto JSON.

se si utilizza l'SDK PHP, proprio come ha detto Abhishek nel commento, $facebook->getSignedRequest(); fornirà il codice decodificato.

sguardo here per maggiori dettagli su richiesta firmata

+0

Hey posso ottenere' l'url' con app_id nell'iframe da aprire nella scheda di Facebook –

6

Se non si desidera lavorare con la FB SDK è possibile utilizzare questo frammento di codice per ottenere l'user_id e di altre variabili (frammento 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

è possibile utilizzare il mio servizio

COME uSARE: basta sparare una richiesta jsonp a questo

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

se il successo verrà restituito qualcosa di simile

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

se fallito il risultato sarà:

Bad signed Json Signature 

felice di codifica !!

3

Vecchio post lo so, ma ho voluto aggiungere una risposta alla risposta di Art Geigel (non posso commentare direttamente su di esso).

tuo frammento di codice manca la linea,

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

e il frammento di 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, '-_', '+/')); 
} 

Per rispondere alla domanda iniziale

Per ottenere i dati dal signed_request, includere le funzioni sopra e ...

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

echo '<pre>'; 
print_r($data); 
Problemi correlati