簡體   English   中英

驗證 Facebook X-Hub 簽名

[英]Verify Facebook X-Hub-Signature

在 Parse 上的雲代碼上,我試圖驗證從 Facebook webhook 收到的標頭x-hub-signature

secret是 Facebook 應用程序的正確密鑰。

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');
}

最后在您的路線中,您可以將其用作:

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

如果您使用中間件將正文解析為對象,請查看Node.js - 使用 Express 獲取原始請求正文

如果你已經在使用原始解析模塊,如果你沒有JSON.stringify req.body,它應該可以工作:

payload = req.body,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM