2

Patreon 文档

消息签名是使用您在 webhook 页面上可查看的 webhook 秘密签名(使用 MD5)的消息正文 HMAC 的十六进制摘要。您可以使用它来验证我们是消息的发件人。

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

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但是与我从标题中获得的值相比,我记录的所有这些结果都不相同。

4

1 回答 1

1

首先确保您的密码在您的代码中是正确的,然后继续创建一个使用加密对有效负载进行哈希处理的新文件。

我开始使用函数 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 来实现它:

请注意:为了验证,您必须比较 SIGNATURE 和 HASH 变量。如果它们相等,则已验证。

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

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 
于 2021-06-17T16:20:32.710 回答