6

我已經通過這question,但我的問題是不同的。我不確定如何才能登錄javascript登錄,以及如何可以不登錄到其他帳戶。如何驗證用戶登錄時使用Facebook Javascript SDK

根據getting startedFB.authResponse在登錄成功時調用,但當然在客戶端。

然後,我們可以得到userId & accessToken出響應的,我們也可以調用/me以獲取更多信息。爲了將該用戶放入會話中,所有關於成功JavaScript登錄的信息都必須發送到服務器,這是我感到困惑的地方。 畢竟它是HTTP,其他每個請求都是不同的,並且可以被複制。

也許只是我很困惑,不知道有人不能僞造和模仿任何其他用戶的Facebook帳戶登錄他的帳戶。

例如,身份驗證成功後,我做了一個ajax調用我的服務器提供 fb-user-id,然後我將它與數據庫匹配,並將適當的用戶放在會話中,但不是因爲這是fb-user-id是沒有在後端再次驗證(或者驗證過?,我沒有發現任何東西),這個特定的用戶是在我的應用程序中實際註冊的用戶,然後與其他人的fb-用戶ID可以登錄到他的賬戶。

我敢肯定,我不是第一個有這種困惑的人。請幫助清除這種混淆,因爲我已經多次閱讀文檔,但仍無法弄清爲什麼其他人無法登錄到其他人的帳戶。

編輯 我發現這個similar question但這裏的人沒有回答他如何驗證後臺登錄,也可以是我無法理解。

回答

9

據:

How to securely authorize a user via Facebook's Javascript SDK

發送signed_request字段到服務器,其在authResponse使用JavaScript SDK被接收

然後,在服務器側,從以下過程在documentation中規定必須遵循以進行驗證:

一旦捕獲了已簽名的請求,您需要執行三個步驟:

  1. 將簽名的請求分成兩部分,用'。'字符(例如238fsdfsd.oijdoifjsidf899)
  2. 解碼第一部分 - 編碼的簽名 - 從base64url
  3. 解碼第二部分 - 「有效載荷」 - 從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

0

在進行圖形API調用時,您需要一個對用戶和應用程序唯一的access_token。 查詢有關用戶標識的調用並對其進行操作時,您正在使用的訪問標識屬於原始用戶,Facebook API僅返回操作標識可能獲得的信息。如果被操縱的用戶是原始的朋友,這可能是不同的。

Simplified: 您的用戶在您的網站上登錄並接受您的範圍參數。 現在,Facebook返回一個用戶ID和一個用戶access_token,僅對該用戶和您的一個應用有效。

大多數圖形調用現在需要一個用戶標識和一個access_token。如果您在用戶好友列表中執行更新請求,並且access_token確實屬於用戶,則圖形API將返回錯誤。

它將access_token存儲在服務器上,並通過HTTP-Request/AJAX將其發送到服務器,而不是通過https,中間的人可以捕獲訪問令牌並濫用它。

+0

如果人在這中間可以使用它,這樣的話我怎麼能驗證登錄在用戶沒有發送用戶ID和訪問令牌?其次,我應該通過哪種API調用來驗證用戶登錄?第三,我相信僅僅通過中間人的用戶標識和標記不會有幫助,但是剝削也需要應用程序祕密。 –

+0

其實你只需要一個訪問令牌。試試這個:在圖形資源管理器中從你的賬戶獲得一個訪問令牌,然後將你的訪問令牌複製到這個URL的後面: https://graph.facebook.com/me/friends?access_token= – user3177614

+0

對不起,我不明白。鏈接也不起作用返回錯誤。 –

相關問題