我正在尝试使用Dropbox API,并成功通过 Webhooks 收到了通知。现在,我想每次收到通知时都验证签名。
根据 Dropbox 的文档,他们写道:
“每个通知请求都将包括一个名为 X-Dropbox-Signature 的标头,其中包括请求正文的 HMAC-SHA256 签名,使用您的应用程序秘密作为签名密钥。这使得您的应用程序可以验证通知确实来自 Dropbox。”
因此,我成功获取了该签名,并使用 NodeJS 内置的 crypto 模块尝试创建自己的 HMAC SHA256 签名,然后将我的签名与 Dropbox 发送给我的签名进行比较。
以下是我用于执行此操作的代码:
根据 Dropbox 的文档,他们写道:
“每个通知请求都将包括一个名为 X-Dropbox-Signature 的标头,其中包括请求正文的 HMAC-SHA256 签名,使用您的应用程序秘密作为签名密钥。这使得您的应用程序可以验证通知确实来自 Dropbox。”
因此,我成功获取了该签名,并使用 NodeJS 内置的 crypto 模块尝试创建自己的 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',密钥是我从我的Dropbox应用页面获取的秘密密钥时,我必须使用JSON.stringify(req.body),因为req.body是一个对象,而hmac.update需要一个字符串。我想知道这是否是导致错误的原因?
我在控制台记录签名(即来自Dropbox的签名),然后我记录了使用hmac创建的签名,但它是不同的签名。
有什么建议可以告诉我可能出了什么问题吗?
JSON.stringify(req.body)
看起来很可疑。你需要对原始请求体进行 HMAC 处理,所以如果req.body
是一个Object
,那可能不是正确的值。我建议查看 Web 框架的文档,看看如何仅检索原始/未处理的请求体。 - Greg