2012-04-02 145 views
1

我和其他許多人一樣,php-sdk中的getUser()方法返回零。 我發現原因是parseSignedRequest()方法中的一個條件。facebook-> getUser()總是返回0

if ($sig !== $expected_sig) { 
    self::errorLog('Bad Signed JSON signature!'); 
    return NULL; 
} 

條件是真的。當我取消註釋這個條件時,它工作正常。我得到了正確的用戶,並且我也可以在我要求的所有權限中獲取令牌。

但我對這個骯髒的解決方案感到不舒服。爲什麼會這樣。服務器上可能存在配置錯誤嗎?

親切的問候

回答

0

我有..花了我4天追查確切同樣的問題...

這裏是有條件的我調試回聲,那就是你有$的結果sig與$ expected_sig進行比較。

SIG:[ꢖbuf^ 4֣GP

預期SIG:{.nwW:RB C8$ %F

因此,出於某種原因,發送的簽名與任何預期的編碼簽名不匹配。

所以我想知道...這裏有什麼可能是錯的?

難道是我沒有通過正確的「祕密」,即使我在我的配置正確設置它?

require_once("facebook.php"); 

$config = array(); 
$config[‘appId’] = $APP_ID; 
$config[‘secret’] = $APP_SECRET; 
$config[‘fileUpload’] = false; // optional 

$facebook = new Facebook($config); 

事實證明,當我使用

$facebook->getAppID(); 

$facebook->getAppSecret(); 

什麼都沒有回來了!

這就是爲什麼我getSignedRequestCookieName()函數返回只有 「fbsr_」

這就是爲什麼錯了哈希

$expected_sig = hash_hmac('sha256', $payload, 
          $facebook->getAppSecret(), $raw = true); 

回報!

但是爲什麼?

答案很簡單:一個格式錯誤的配置陣列...

使用 「$配置[‘APPID’] = $ APP_ID;」 ......看到周圍的引號 「APPID」。這是來自Facebook開發人員文檔上docs/examples的直接複製/粘貼。

與標準的雙引號

$config = array(); 
$config["appId"] = $APP_ID; 
$config["secret"] = $APP_SECRET; 
$config["fileUpload"] = false; // optional 

更換這些報價...這裏的結果:

SIG:r0g%的W(B^DDV

預計SIG:r0g% w ^(B^DDV

現在他們匹配...

長話短說...做的phpinfo(),以確保你得到一個signed_request令牌.. 。如果你確定你得到了這個(或者「$ REQUEST [fbsr #######]」var)...如果你確定你正在得到一個經過編碼的簽名請求......如果你沒有得到,只有你的哈希不匹配的原因在那裏的祕密。