據:
How to securely authorize a user via Facebook's Javascript SDK
發送signed_request字段到服務器,其在authResponse
使用JavaScript SDK被接收
然後,在服務器側,從以下過程在documentation中規定必須遵循以進行驗證:
一旦捕獲了已簽名的請求,您需要執行三個步驟:
- 將簽名的請求分成兩部分,用'。'字符(例如238fsdfsd.oijdoifjsidf899)
- 解碼第一部分 - 編碼的簽名 - 從base64url
- 解碼第二部分 - 「有效載荷」 - 從base64url然後解碼所得JSON對象
這裏是PHP的例子:
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, '-_', '+/'));
}
這將產生一個JSON對象,它看起來是這樣的:
{
"oauth_token": "{user-access-token}",
"algorithm": "HMAC-SHA256",
"expires": 1291840400,
"issued_at": 1291836800,
"user_id": "218471"
}
獲取user_id後,可以將該特定用戶放入會話中,但需要進行其他檢查才能正確授權。
作爲第二次檢查,可以檢查issued_at
以查看它是否不超過10分鐘。
摘自here。
但是,可能有些情況下,您的app_secret可能是 受到威脅。爲了照顧這種情況,您應該按照步驟3進行操作,因爲 access_token的代碼交換隻能發生一次,並在 之間發生10分鐘的問題。如果用戶沒有您的 網站的帳戶,那麼您無論如何都需要第3步使用access_token來獲取其他必要的用戶數據,如姓名,電子郵件等。
爲了刷新令牌下面的調用可以從你的服務器進行
GET /oauth/access_token?
grant_type=fb_exchange_token&
client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token}
Reference
如果人在這中間可以使用它,這樣的話我怎麼能驗證登錄在用戶沒有發送用戶ID和訪問令牌?其次,我應該通過哪種API調用來驗證用戶登錄?第三,我相信僅僅通過中間人的用戶標識和標記不會有幫助,但是剝削也需要應用程序祕密。 –
其實你只需要一個訪問令牌。試試這個:在圖形資源管理器中從你的賬戶獲得一個訪問令牌,然後將你的訪問令牌複製到這個URL的後面: https://graph.facebook.com/me/friends?access_token= – user3177614
對不起,我不明白。鏈接也不起作用返回錯誤。 –