首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证Mandrill的X-Mandrill签名

验证Mandrill的X-Mandrill签名
EN

Stack Overflow用户
提问于 2013-06-18 23:50:12
回答 2查看 2.2K关注 0票数 5

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

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

代码语言:javascript
复制
/**
 * 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));
}

所以我想出了这个:

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

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

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

代码语言:javascript
复制
mandrill_events=%5B%7B%22event%22%3A%22inbound ...

Urldecoded:

代码语言:javascript
复制
mandrill_events=[{"event":"inbound ...

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

代码语言:javascript
复制
mandrill_events[{"event":"inbound ...

对此有什么想法吗?

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

EN

回答 2

Stack Overflow用户

发布于 2014-12-04 23:06:18

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

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

代码语言:javascript
复制
// 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”检查的字符串。

票数 3
EN

Stack Overflow用户

发布于 2013-10-22 21:58:03

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

var data = URL;for(POST_DATA中的var key ) data += key+POST_DATAkey;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17173387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档