facebook-> getUser()总是返回0

时间:2012-04-02 14:57:05

标签: oauth facebook-php-sdk

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

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

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

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

亲切的问候

1 个答案:

答案 0 :(得分:0)

我遇到了完全相同的问题..我花了4天时间跟踪它...

这是条件调试回显的结果,其中$ sig与$ expected_sig进行比较。

sig:[ ꢖ b u f ^ 4֣ GP

预期信号: { . nwW : r B 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);

返回错误的哈希!

但是为什么?

简单回答:一个格式错误的配置数组...

使用“$ config ['appId'] = $ APP_ID;”...注意“appId”周围的引号。这是来自facebook开发者文档的文档/示例的直接复制/粘贴。

用标准双引号替换这些引号

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

...这是结果:

sig:r 0 g% ͦ w ( B^ Ddv

预期信号:r 0 g% ͦ w ( B^ Ddv

他们现在匹配...

长话短说...做一个phpinfo()以确保你获得了一个signed_request令牌...如果你确定你得到了它(或者“$ 请求[fbsr ] #######]“var)...如果你确定你正在获得一个编码的签名请求...你的哈希不匹配的唯一原因是你没有得到正确的秘密那里。