javascript - 验证 Facebook X-Hub-签名

标签 javascript node.js facebook parse-platform webhooks

在 Cloud Code on Parse 上,我正在尝试验证从 Facebook webhook 收到的 header x-hub-signature

secret 是 Facebook 应用程序的正确 key 。

var
hmac,
expectedSignature,
payload = JSON.stringify(req.body),
secret = 'xyzxyzxyz';

hmac = crypto.createHmac('sha1', secret);
hmac.update(payload, 'utf-8');
expectedSignature = 'sha1=' + hmac.digest('hex');
console.log(expectedSignature);
console.log(req.headers['x-hub-signature']);

但签名永远不匹配。 怎么了?

最佳答案

您的 bodyParserJSON 应该返回 rawBody:

bodyParser.json({
    verify(req, res, buf) {
      req.rawBody = buf;
    },
})

这是我编写的中间件。它使用crypto模块生成sha1

fbWebhookAuth: (req, res, next) => {
    const hmac = crypto.createHmac('sha1', process.env.FB_APP_SECRET);
    // hmac.update(req.rawBody, 'utf-8'); //older versions
    hmac.update(req.rawBody, 'utf8');
    if (req.headers['x-hub-signature'] === `sha1=${hmac.digest('hex')}`) next();
    else res.status(400).send('Invalid signature');
}

最后在您的 route 您可以将其用作:

app.post('/webhook/facebook', middlewares.fbWebhookAuth, facebook.webhook);

关于javascript - 验证 Facebook X-Hub-签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37946219/

相关文章:

javascript - <select>...</select> 源代码的 CSS 选择器

node.js - 检查最新的 npm 包版本是否具有相同的主要版本

facebook - 如何使用访问 token 获取 Facebook 用户 ID

facebook - 页面选项卡的 signed_request 偶尔未填充

javascript - DataTable - 分页和过滤器不适用于 JavaScript 生成的表

javascript - 在 sequelize 中不使用 dataValues 对象访问变量

javascript - 如何让 jQuery UI slider 在单击后检测 mouseup

javascript - Node 和 Node js 之间有什么区别?

javascript - 将外部作用域逻辑传递给回调函数 javascript nodejs

Facebook 连接 <fb :login-button> No Longer Firing Callback (As of today)