当前位置: 首页 > 知识库问答 >
问题:

如何验证Patreon的网络钩子消息?

孟修竹
2023-03-14

来自Patreon文档:

消息签名是消息体HMAC的十六进制摘要,HMAC使用webhooks页面上可查看的webhook的秘密进行签名(使用MD5)。您可以使用此项验证我们是否是邮件的发件人。

这就是我尝试验证Express服务器中的消息的方式:

js prettyprint-override">import express from 'express';
import CryptoJS from 'crypto-js';
const router = express();

router.post('/webhook', function (req, res) {
  const secret = 'Secret from https://www.patreon.com/portal/registration/register-webhooks';

  console.log(CryptoJS.HmacMD5(req.body, secret).toString(CryptoJS.enc.Hex))

  console.log(CryptoJS.HmacMD5(JSON.stringify(req.body), secret).toString(CryptoJS.enc.Hex))

  const wordArray = CryptoJS.enc.Utf8.parse(req.body)
  const hexString = CryptoJS.enc.Hex.stringify(wordArray);
  console.log(CryptoJS.HmacMD5(hexString, secret).toString(CryptoJS.enc.Hex))

  res.send();
});

但我记录的所有这些结果与我从标题中获得的X-Patreon-Signature值不同。

共有1个答案

舒宏富
2023-03-14

首先确保您的秘密在代码中是正确的,然后继续创建一个使用加密来散列有效负载的新文件。

我从使用功能ComputeHash制作散列模块文件开始。此函数为参数获取秘密和有效负载:

const crypto = require('crypto');

/**
 * @return {string}
 */
exports.ComputeHash = function (secret, payload)
{
    // string to be hashed
    const str = JSON.stringify(payload);

    // create a md5 hasher
    const md5Hasher = crypto.createHmac("md5", secret);

    // hash the string
    // and set the output format
    const hash = md5Hasher.update(str).digest("hex");

    return(hash);
};

现在,在API文件中使用patreon应该如何实现:

注意:为了验证,您必须比较签名和哈希变量。如果两者相等,则进行验证。

我建议使用中间件来实现它,但出于演示目的,我这样做了。

const Hasher = require('./../modules/Hasher');

//more code

.post('/', async (req, res) => {

try {
    const secret = config.token;
    const signature = req.headers["x-patreon-signature"];
    const Hash = Hasher.ComputeHash(secret, req.body);

    console.log(signature);
    console.log(Hash);

    const verified = (signature === Hash);

} catch (e) {
    res.status(401);
    res.end();
    
}
// more code 
 类似资料:
  • 我正在尝试用python制作一个电报回声机器人。我在heroku上托管我的python。 起初,我只是对python请求使用了电报本地API方法,然后我使用了一个python-telegram-bot库。 我能够让常规的getUpdate方法(使用长轮询——即heroku定期向您的电报机器人发出请求以获取更新)工作,但webhook不能。 我认为问题是heroku不会允许进入港口 有谁知道我该怎么

  • 我一直想做实时聊天。 多年前,我在PHP Ajax Mysql中就这样做了,并破坏了我的服务器。 然后我用Flash试了一个文本文件。我放弃了,已经10年没有尝试过了。但是最近我听说了webhooks和websockets。 它们似乎都是做到这一点的一种方式,但我并没有真正理解其中的区别。 任何人都可以解释吗? 谢谢!

  • 我通过GitHub将我的电报机器人部署到Heroku(我使用Webhook),机器人正在运行,但由于某种原因,它没有通过Webhook接收消息。 代码如下: 文件:

  • 我想挂一个窗口并接收它的消息 获取了(is int),但是如何将其转换为并使用?

  • 我有一个webhook来接收我正在尝试配置的更新。我需要从标头中获取不记名令牌,但我无法检索它。有人能解释一下这个问题吗?我被难住了! 接收网址https://example.com/receive

  • 状态{statuscode=network_error,resolution=null} 任何形式的帮助都将受到高度赞赏。