validationMandrill的X-Mandrill-Signature

我正在开发一个Node.js应用程序,我正在努力validationMandrill 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 ... 

Urldecoded:

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

Mandrill文档说,不应该包含分隔符,所以这是我使用的string(不= ):

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

任何想法呢?

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

使用示例中的URL( config.url )和https://mandrillapp.com/settings/webhooks中显示的特定Webhook的密钥&#xFF08; 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的string是你检查标题'X-Mandrill-Signature'。

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

var data = URL; for(var key in POST_DATA)data + = key + POST_DATA [key];

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