消息签名是使用web钩子页面上可查看的web钩子签名的消息体HMAC的HEX摘要(用MD5)。您可以使用它来验证我们是否是消息的发送方。
这就是我试图在我的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值相比,我正在日志记录的所有这些结果并不相同。
发布于 2021-06-17 16:20:32
确保您的秘密在您的代码中是正确的,然后继续并创建一个使用密码散列有效载荷的新文件。
我从使用函数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 https://stackoverflow.com/questions/66518253
复制相似问题