5

Theo Facebook - Authentication within a Canvas Page Document, họ nói rằng chúng tôi sẽ nhận được một signed_request trong đó bao gồm một đối tượng JSON. Bây giờ họ nói rằng signed_request có thể được thông qua $_POST['signed_request'] Tôi đồng ý nó làm việc cho tôi.làm thế nào để đọc facebook signed_request để có được user_id

Bây giờ theo họ nếu người dùng đang đăng nhập tôi sẽ nhận được một giá trị đối tượng JSON như thế này: -

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

Bây giờ tôi muốn lấy user_id ra điều này vì vậy tôi đang sử dụng mảnh này mã nhưng không hoạt động: -

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

Nó chỉ in YES. Tại sao nó như vậy?

Tôi đã đọc ở đâu đó mà không có xác thực ứng dụng, tôi sẽ không thể trích xuất user_id nhưng theo facebook, đây là bước đầu tiên và xác thực ứng dụng sẽ là 4. Tôi mới làm quen với nó, nếu ai đó có thể giúp tôi, nó sẽ giúp ích rất nhiều. Cảm ơn.

+0

Nếu bạn thực hiện 'print_r ($ _ POST)', bạn thấy gì? – Brad

+0

Bạn thực sự thấy gì khi bạn thử 'print_r ($ _ POST)'? – Brad

+0

@Brad khi i 'print_r ($ _ POST [ 'signed_request']);' tôi nhận được chính xác giá trị này 'cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-k1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf aWQiOiIxNTc2NDU1NjQ5In0' –

Trả lời

2

Tôi nghĩ rằng nó không thành công tại json_decode($json)$json không phải là chuỗi json hợp lệ, như bạn đã đề cập trong nhận xét về print_r($_POST['signed_request']);.

Theo Facebook - Authentication within a Canvas Page Document, tham số signed_request được mã hóa và phân tích các signed_request chuỗi sẽ mang lại một đối tượng JSON.

nếu bạn đang sử dụng SDK PHP, giống như Abhishek đã nói trong nhận xét, $facebook->getSignedRequest(); sẽ cung cấp cho bạn mã được giải mã.

nhìn here để biết thêm chi tiết về các yêu cầu Signed

+0

Tôi có thể lấy' url' với app_id trong khung nội tuyến để mở trong tab facebook –

6

Nếu bạn không muốn làm việc với FB SDK bạn có thể sử dụng đoạn mã này để có được những user_id và các biến khác (đoạn mã từ 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

bạn có thể sử dụng dịch vụ của tôi

CÁCH sỬ dỤNG: chỉ bắn một yêu cầu jsonp này

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

nếu thành công nó sẽ trở lại một cái gì đó như thế này

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

nếu không nó sẽ ra:

Bad signed Json Signature 

hạnh phúc mã hóa !!

3

Bài đăng cũ tôi biết nhưng muốn thêm trả lời cho câu trả lời của Art Geigel (Tôi không thể nhận xét trực tiếp trên đó).

đoạn mã của bạn thiếu dòng,

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

và đoạn hoàn tất,

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

Để trả lời câu hỏi ban đầu

Để lấy dữ liệu từ các signed_request, bao gồm các chức năng ở trên và ...

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

echo '<pre>'; 
print_r($data); 
Các vấn đề liên quan