我和许多其他人一样有问题,php-sdk中的方法getUser()总是返回零。 我发现原因是parseSignedRequest()方法中的一个条件。
if ($sig !== $expected_sig) {
self::errorLog('Bad Signed JSON signature!');
return NULL;
}
条件总是如此。当我取消注释这个条件时它工作正常。我得到了正确的用户,我也可以在我要求的所有权限中获取令牌。
但是我对这个肮脏的解决方案感到不舒服。为什么会这样呢?是否可能在服务器上配置错误。
亲切的问候
答案 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)...如果你确定你正在获得一个编码的签名请求...你的哈希不匹配的唯一原因是你没有得到正确的秘密那里。