【发布时间】:2011-12-18 03:59:53
【问题描述】:
我正在尝试使用 node.js 实现 Facebook 库,但请求签名不起作用。我将 PHP 示例 seen here 翻译成节点。我正在使用那里给出的示例进行尝试,其中秘密是字符串“秘密”。我的代码如下所示:
var signedRequest = request.signed_request.split('.');
var sig = b64url.decode(signedRequest[0]);
var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest();
console.log(sig == expected); // false
我不能 console.log 解码的字符串本身,因为它们具有导致控制台清除的特殊字符(如果您有解决此问题的建议,请告诉我)但我可以输出它们的 b64url 编码.
正如您在 FB 文档中看到的,预期的编码信号是
vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso
我的expected 值在编码后是
wr5Vw6DCu8KuAUBhUkLCtjRlw4JBZATCjMK9wovDkx7Dr0ZDRgzDtsK4w49Kw4o
那么为什么我认为digest 是错误的呢?也许错误在我这边?好吧,如果我执行文档中给出的 PHP 中的确切示例,就会得到正确的结果。但是如果我改变hash_hmac调用所以最后一个参数是假的,输出十六进制,我得到
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ==
现在,如果我回到我的 javascript 代码,并将我的 hmac 代码更改为 .digest("hex") 而不是默认的 "binary" 并记录结果的 base64 编码,我会得到......惊喜!
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ
同样,除了末尾缺少 == 符号,但我认为这是控制台的问题。我无法想象这是问题所在,没有它们,它甚至不是有效的 base64 字符串长度。
那么,为什么摘要方法在使用十六进制时输出正确结果,但在使用二进制时输出错误答案?二进制文件与 PHP 等价物的“原始”输出不完全相同吗?如果是这样的话,正确的称呼方式是什么?
【问题讨论】:
标签: php facebook authentication node.js facebook-graph-api