facebook-> getUser()总是返回0

问题描述:

我和其他许多人一样,php-sdk中的getUser()方法返回零。 我发现原因是parseSignedRequest()方法中的一个条件。facebook-> getUser()总是返回0

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

条件是真的。当我取消注释这个条件时,它工作正常。我得到了正确的用户,并且我也可以在我要求的所有权限中获取令牌。

但我对这个肮脏的解决方案感到不舒服。为什么会这样。服务器上可能存在配置错误吗?

亲切的问候

我有..花了我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)...如果你确定你正在得到一个经过编码的签名请求......如果你没有得到,只有你的哈希不匹配的原因在那里的秘密。