5

Według Facebook - Authentication within a Canvas Page Document, mówią, że otrzymamy signed_request, który składa się z obiektu JSON. Teraz mówią, że signed_request można przejść przez $_POST['signed_request'] Zgadzam się, że działa dla mnie.jak odczytać facebook signed_request, aby uzyskać user_id

Teraz według nich, jeśli użytkownik jest zalogowany i będzie coraz JSON wartość obiektu takiego: -

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

Teraz chcę pobrać user_id się z tego tak używam ten kawałek kod, ale nie działa: -

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

Po prostu drukuje YES. Dlaczego tak jest?

Czytałem gdzieś, że bez uwierzytelniania aplikacji nie będę w stanie wyodrębnić user_id, ale według facebooka, jest to pierwszy krok i uwierzytelnianie aplikacji będzie 4. Jestem dla niego nowy, jeśli ktoś może mi pomóc, to będzie bardzo pomocne. Dzięki.

+0

Jeśli robisz 'print_r ($ _ POST)', co widzisz? – Brad

+0

Co faktycznie widzisz przy próbie 'print_r ($ _ POST)'? – Brad

+0

@Brad kiedy 'print_r ($ _ POST [ 'signed_request']);' ja dostać dokładnie to wartość 'cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-K1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf aWQiOiIxNTc2NDU1NjQ5In0' –

Odpowiedz

2

Myślę, że nie powiodło się na json_decode($json), ponieważ $json nie jest prawidłowym ciągiem json, jak wspomniano w komentarzu o print_r($_POST['signed_request']);.

Według Facebook - Authentication within a Canvas Page Document parametr signed_request jest kodowany i analizowania Ciąg signed_request przyniesie obiektu JSON.

jeśli używasz PHP SDK, tak jak powiedział Abhishek w komentarzu, $facebook->getSignedRequest(); da ci zdekodowany json.

wygląd here więcej szczegółów na temat podpisanego wniosku

+0

Hej, mogę uzyskać' adres url' z app_id w elemencie iframe do otwarcia w zakładce facebook –

6

Jeśli nie chcą pracować z FB SDK można użyć tego fragmentu kodu, aby uzyskać user_id i innych zmiennych (snippet z 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

można użyć mój serwis

jAK STOSOWAĆ: tylko ogień wniosek jsonp do tego

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

jeśli sukces powróci coś jak ten

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

jeśli zawiodły to wyświetli:

Bad signed Json Signature 

szczęśliwy kodowania !!

3

Stary post Wiem, ale chciałem dodać odpowiedź Art Geigel (nie mogę bezpośrednio wypowiedzieć się na jej temat).

fragmencie kodu brakuje linii,

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

i pełna urywek,

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

Aby odpowiedzieć na pierwotne pytanie

aby uzyskać dane z signed_request, m.in. powyższe funkcje i ...

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

echo '<pre>'; 
print_r($data); 
Powiązane problemy