【发布时间】:2021-07-19 19:13:49
【问题描述】:
我正在尝试使用 Dropbox 的 API,我让它通过 webhook 成功向我发送警报,但现在我想在每次他们向我发送警报时验证签名。
从 Dropbox 的文档中,他们写道:
“每个通知请求都将包含一个名为 X-Dropbox-Signature 的标头,其中包含请求正文的 HMAC-SHA256 签名,使用您的应用程序密钥作为签名密钥。这让您的应用程序可以验证通知是否真的来自 Dropbox。”
所以我成功捕获了该签名,并使用 NodeJS 内置的加密模块尝试使用 HMAC SHA256 创建我自己的签名,然后将我的签名与 Dropbox 发送给我的签名进行比较。
这是我这样做的代码:
var sign = req.get("X-Dropbox-Signature");
console.log(sign);
var hmac = crypto.createHmac(algorithm, secret);
hmac.update(JSON.stringify(req.body));
hash = hmac.digest('hex');
console.log(hash);
算法只是'sha256' secret 是我从 Dropbox 应用程序页面获得的密钥。 我必须使用 JSON.stringify(req.body) 因为 req.body 是一个对象而 hmac.update 需要一个字符串。我想知道这是否是我的错误的来源?
我在控制台记录签名,它是来自 Dropbox 的签名,然后我在控制台记录我使用 hmac 创建的签名,但它是不同的签名。
对我可能做错的任何建议?
【问题讨论】:
-
乍一看,
JSON.stringify(req.body)看起来很可疑。您需要获取原始请求正文的 HMAC,因此如果req.body是Object,那可能不是正确的值。我建议您查看 Web 框架的文档,了解如何仅检索原始/原始请求正文。
标签: node.js dropbox dropbox-api sha256 hmac