2013-06-18 31 views
4

我正在開發一個Node.js應用程序,我正在努力驗證Mandrill Webhook請求。驗證Mandrill的X-Mandrill-Signature

如這裏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數據來自url編碼,如:

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

Urldecoded:

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

山魈醫生說,該分隔符不應該被包括在內,所以這是我使用的字符串(無=):

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

有關於此的任何想法?

PS:我仔細檢查了URL和Webhook Key :-)。

回答

1

問題來自您的輸入數據格式。您必須連接鍵/值對,例如:

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

現在,您可以檢查base64(sha1(data,mkey))是否等於簽名。

3

使用該特定Webhook的https://mandrillapp.com/settings/webhooks中顯示的URL(示例中爲config.url)和密鑰(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-山魈簽名」。

+0

這裏要明確,mandrillEventsParamVal應該引用URL的查詢部分,是否正確? '?'之後的任何內容在一個網址。 – Brant