5

根據Facebook - Authentication within a Canvas Page Document,他們說我們將得到一個由一個JSON對象組成的signed_request。現在他們說signed_request可以通過$_POST['signed_request']我同意它爲我工作。如何閱讀Facebook的signed_request獲取user_id

現在根據他們,如果用戶登錄我會得到這樣一個JSON對象值: -

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

現在我想取user_id出這個所以我用這塊代碼但它不工作: -

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

它只是打印YES。爲什麼這樣?

我讀過的地方沒有應用程序認證,我將無法提取user_id,但根據facebook,這是第一步,認證應用程序將是第四。我對此很陌生,如果有人能幫助我,這將會非常有幫助。謝謝。

+0

如果你做了一個'print_r($ _ POST)',你看到了什麼? – Brad 2012-08-15 16:35:08

+0

當你嘗試'print_r($ _ POST)'時,你實際看到了什麼? – Brad 2012-08-15 16:38:23

+0

@Brad當我'的print_r($ _ POST [ 'signed_request']);'我得到的正是這種價值'cnMQQpKShmtfcXXEAjNrazO7AZxAqCuZ0aIA-K1L-P8.qgytuisdhrl0aG0iOiJITUFDLVNIQTI1NiI sImV4cGlyZXMiOjEzNDUwNTM2MDAsImlzc3VlZF9hdCI6MTM0NTA0ODYwOCpoemi1dGhfdG9rZW4iOiJB QUFFOGZCWW1sN2NCQUJHVWZIb1VZUGdMcngwdjBURFlSdVFiNHNQR2pSMDRUNnZKZHkzWkFYU2RBYWNiV nFtMHJRZTFKZ2lrWkFRWkFJR2RPb0JuQ0JiVGxLOGpuUXlCSVpDWkJsWHdzWG5XbHg5VVZEV1dkIiwicG FnZSI6eyJpZCI6IjI2OTY3MDc5NjQ4MDcxOCIsImxpa2VkIjpmYWxzZSwiYWRtaW4iOmZhbHNlfSwidXN lciI6eyJjb3VudHJ5IjoiaW4iLCJsb2NhbGUiOiJlbl9JTiIsImFnZSI6eyJtaW4iOjIxfX0sInVzZXJf aWQiOiIxNTc2NDU1NjQ5In0' – 2012-08-15 16:39:39

回答

2

我認爲它在json_decode($json)失敗,因爲$json不是一個有效的json字符串,正如您在關於print_r($_POST['signed_request']);的註釋中提到的那樣。

根據Facebook - Authentication within a Canvas Page Document,所述signed_request參數被編碼和,解析signed_request串將產生JSON對象。

如果您使用的是PHP SDK,就像Abhishek在評論中說的那樣,$facebook->getSignedRequest();會給你解碼的json。

here有關簽名的請求的詳細信息

+0

嘿,我可以通過iframe中的app_id獲取'url',以在Facebook標籤中打開 – 2013-07-15 06:40:25

6

如果你不想與FB SDK工作,你可以使用此代碼段將得到USER_ID和其他變量(段從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

,你可以使用我的服務

如何使用: 剛剛火JSONP請求該

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

如果成功,它將返回這樣的事情

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

如果失敗,會輸出:

Bad signed Json Signature 

編碼快樂!

3

舊帖子我知道但想給Art Geigel的答覆添加一個回覆(我不能直接評論它)。

你的代碼片段缺失行,

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

和完整的片段,

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

要回答原來的問題

要從signed_request獲取數據,包括以上功能和...

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

echo '<pre>'; 
print_r($data); 
相關問題