【问题标题】:Validate Mandrill's X-Mandrill-Signature验证 Mandrill 的 X-Mandrill 签名
【发布时间】:2013-06-14 22:24:42
【问题描述】:

我正在开发一个 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));
}

所以我想出了这个:

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

很遗憾,这不起作用。我得到一个不同的签名。

POST 数据是 urlencoded,例如:

mandrill_events=%5B%7B%22event%22%3A%22inbound ...

网址解码:

mandrill_events=[{"event":"inbound ...

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

mandrill_events[{"event":"inbound ...

对此有什么想法吗?

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

【问题讨论】:

    标签: javascript node.js cryptography mandrill


    【解决方案1】:

    使用该特定 Webhook 的 URL(在示例中为 config.url)和在 https://mandrillapp.com/settings/webhooks 中显示的密钥 (config.key)。

    除了上述响应之外,您还必须确保正斜杠使用单个反斜杠进行转义。

    // mandrillEventsParamVal - how you get that depends on your request processor chain
    var paramValEscaped = mandrillEventsParamVal.replace(/\//g, '\\\/');
    var input = config.url + 'mandrill_events' + paramValEscaped;
    var check = crypto.createHmac('sha1', config.key).update(input, 'utf8', 'binary').digest('base64');
    

    名为check 的字符串是您对照标题“X-Mandrill-Signature”检查的内容。

    【讨论】:

    • 这里要明确一点,mandrillEventsParamVal 应该指的是 URL 的查询部分,对吗? “?”之后的任何内容在一个网址中。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2018-12-08
      • 2016-04-21
      • 2018-08-15
      • 2015-11-17
      • 2014-01-29
      • 2015-12-31
      • 2019-01-26
      • 2013-07-16
      相关资源
      最近更新 更多