2013-06-18 4 views
4

Я разрабатываю приложение Node.js, и я борюсь за проверку запроса Mandrill Webhook.Подтвердить подпись Mandrill X-Mandrill

Как указано здесь 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 говорит, что ограничитель не должен быть включен, так что это строка, я использую (без =):

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

Любые идеи о том, что?

PS: Я дважды проверил URL-адрес и ключ Webhook :-).

ответ

1

Проблема возникает из вашего формата входных данных. Вам необходимо указать пару ключ/значение, например:

var data = URL; для (ключ var в POST_DATA) данные + = ключ + POST_DATA [ключ];

И теперь вы можете проверить, равна ли base64 (sha1 (data, mkey)) сигнатуре.

3

Используйте URL-адрес (config.url в примере) и ключ (config.key), который отображается в https://mandrillapp.com/settings/webhooks для этого конкретного веб-узла.

В дополнение к вышеуказанному ответу, вы должны убедиться, что косые черты сбрасываются с помощью одной обратной косой черты.

// 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-подпись».

+0

Чтобы быть понятным здесь, mandrillEventsParamVal должен ссылаться на часть запроса URL-адреса, правильно? Что-нибудь после «?» в URL. – Brant

Смежные вопросы