2015-04-01 93 views
0

我試圖實現通過JavaScript和PHP SDK保護的Facebook登錄

  1. 的Javascript檢查,如果用戶登錄或沒有,如果有的話,發送一個代碼(無論是或的access_token signedRequest)至PHP安全地處理登錄。
  2. PHP將從JavaScript代碼和使用app_secret,將確保從JavaScript給出的代碼是有效的。
  3. 使用PHP SDK我想用appsecret_proof將我所有的Graph API調用都打開,這樣我就可以打開FB App中的「所有調用需要證明」。

當我得

1)我公司目前擁有的JavaScript在頁面加載時,並假設這個特定的用戶登錄,在這種情況下驗證該初始化,然後我有機會獲得$helper = new FacebookJavaScriptLoginHelper();類,我可以在那裏獲得會話並使用PHP進行調用,我也可以直接使用訪問令牌$session = new FacebookSession('access token here'); - 太棒了!

2)我有這段代碼將檢查JS響應的signedRequest屬性,檢查app_secret - 太好了!

$signed_request = $_POST['signedRequest']; 
list($encoded_sig, $payload) = explode('.', $signed_request, 2); 
$secret = "mysecret"; // 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) { 
    return null; 
} 

//this is the oAuth code. 
echo $data['code']; 

哪裏我不清楚

我很困惑,在我想要達到3點)。

我想利用與appsecret_proof

使用FB PHP SDK類的偉大工程,它不會發送appsecret_proof以下代碼段

安全的服務器端調用。 (如果從2檢查結果)是空的,我可以只燒掉劇本那裏,所以這很好。)

$helper = new FacebookJavaScriptLoginHelper(); 
$session = $helper->getSession(); 
$request = new FacebookRequest($session, 'GET', '/me'); 
$response = $request->execute(); 
$graphObject = $response->getGraphObject(); 

我可以捲曲,將有appsecret_proof但是這是不可能的使用PHP SDK(通過那裏更乾淨)。

curl \ 
    -F 'access_token=<access_token>' \ 
    -F 'appsecret_proof=<app secret proof>' \ 
    -F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/friends?limit=50"}]' \ 
    https://graph.facebook.com 

也許吧?

一旦我完成2)我應該getLongLivedSession()在JS SDK短命的access_token然後validate()使用Facebook\FacebookSession命名空間。驗證和我在2)所做的一樣嗎?如果我這樣做,我還可以打開FB App中的'所有呼叫的需求證明'嗎?

注意:如果您對我的問題投了反對票,請解釋爲什麼,我仍然不明白爲什麼我的最後一個問題被低估了,因此我無法改進。

+1

無論如何,使用appsecret_proof應該是PHP SDK v4的默認值(除非您明確禁用它)。您是否真的嘗試過在應用程序儀表板中啓用遷移,並且失敗? – CBroe 2015-04-02 01:34:53

+0

Ah OK是的,該選項稍微改變爲「需要應用程序的祕密」,當勾選爲是時,它仍然有效。它必須使用FacebookSession :: setDefaultApplication(Appid,AppSecret)中的應用程序祕密。在步驟2)中是否還有使用檢查的情況?儘管這似乎仍然沒有使用appsecret_proof(它是app_secret和訪問令牌的散列)。我是否已經過時了,還是我在當前的設置中安全? – 2015-04-02 09:13:42

回答

0

首先,應用程序在Settings-> Advanced中有兩個安全功能。

  1. 要求應用程序祕密進行服務器API調用。雖然沒有明確地做,但是你在這裏輸入應用程序的祕密FacebookSession :: setDefaultApplication(Appid,AppSecret),所以你的應用程序的祕密是通過所有的服務器api調用發送的。
  2. 服務器IP白名單 - 這將確保如果您的應用祕密受到侵害,有人仍然需要通過您的服務器發送電話(棘手!)。

其次,代碼明智我運行以下命令以幫助保護:

  1. 我運行2,我在我的問題提到入住)。
  2. 我也使用$ session-> validate()方法。
  3. 我然後$ session->擴展訪問令牌。

我相信這現在是安全的。