验证 Mandrill 的 X-Mandrill 签名

Ale*_*der 5 javascript cryptography node.js mandrill

我正在开发一个 Node.js 应用程序,并且正在努力验证 Mandrill Webhook 请求。

正如这里所述http://help.mandrill.com/entries/23704122-Authenticating-webhook-requests它在 PHP 中应该是这样的:

/**
 * Generates a base64-encoded signature for a Mandrill webhook request.
 * @param string $webhook_key the webhook's authentication key
 * @param string $url the webhook url
 * @param array $params the request's POST parameters
 */
function generateSignature($webhook_key, $url, $params) {
    $signed_data = $url;
    ksort($params);
    foreach ($params as $key => $value) {
        $signed_data .= $key;
        $signed_data .= $value;
    }

    return base64_encode(hash_hmac('sha1', $signed_data, $webhook_key, true));
}
Run Code Online (Sandbox Code Playgroud)

所以我想出了这个:

var url = "http://....";
var post = "<POST Data>";
require('crypto').createHmac("SHA1", "<Webhook Signature Key>").update(url+post).digest("base64");
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用。我得到了不同的签名。

POST 数据经过 urlencode 编码,例如:

mandrill_events=%5B%7B%22event%22%3A%22inbound ...
Run Code Online (Sandbox Code Playgroud)

网址解码:

mandrill_events=[{"event":"inbound ...
Run Code Online (Sandbox Code Playgroud)

Mandrill 文档说,不应包含分隔符,所以这是我正在使用的字符串(不带=):

mandrill_events[{"event":"inbound ...
Run Code Online (Sandbox Code Playgroud)

对此有什么想法吗?

PS:我仔细检查了 URL 和 Webhook Key :-)。

dev*_*ide 1

问题出在您的输入数据格式上。您必须连接键/值对,例如:

var 数据 = 网址;for(POST_DATA 中的 var key) data += key+POST_DATA[key];

现在,您可以检查 base64(sha1(data, mkey)) 是否等于签名。