2016-07-31 5 views
1

Я работаю с gocardless hooks, и я застрял на проверке подписи hmac с средой песочницы.gocardless PHP hmac подпись не соответствует

Так что я сгенерировал тест webhook в песочнице, и он дал мне тело запроса и заголовки, как он отправил.

Итак, насколько я понимаю, я должен получить тело запроса и создать хэш с секретным ключом и сравнить его с хешем заголовка подписи webhook (не очень сложным звуком).

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

Вот что я пробовал:

$signature = hash_hmac('sha256',$request->getContent(), 'secret'); 

Обратите внимание, я использую рамку Laravel, поэтому мое первое мышление может быть рамки манипулируют внутри запрос, поэтому я попытался это:

$request_data = file_get_contents('php://input'); 
$signature = hash_hmac('sha256',$request_data, 'secret'); 

Но все-таки не соответствует, я заметил много новых линий и, возможно, это может изменить результаты, поэтому я его очистил ...

$request_data = str_replace(array('.', ' ', "\n", "\t", "\r"), '', $request_data); 

Но все же не совпадают, а также я попытался вывести данные тела в utf8 и сделать hmac возвратом raw и кодировать его в base64 ... но не удастся.

Так что может быть неправильным здесь? Может быть, подписи не работают в среде песочницы? Кто-нибудь с этим справился?

Спасибо заранее!

ответ

2

Наконец-то я нашел проблему, на панели песочницы в goocardless они показывают запрос unminified, поэтому длина отличается, просто ее минимизируйте, и вы сможете протестировать! и теперь подписи совпадают!

+0

Не могли бы вы уточнить, что вы подразумеваете под unminified? Может быть, пример может быть полезен. – guival

+0

Я был скопирован, чтобы вставить объект goocardless webhook отправленному почтальону и отправить его в мою конечную точку для имитации приема веб-чек, в ответе на веб-хост теста панели GC отображается идентификация (для лучшего чтения), а подпись не соответствует, поскольку длина будет быть разными, они посылают мини-запрос, не означая пробелов! –

+1

Получил это, спасибо. Я думал, ты имеешь в виду, что там были разрывы строк или такие вещи. Это помогает знать, что не должно быть никаких пробелов. – guival

1

Мы обновили документацию для разработчиков, и вы можете найти пример проверки webhook подписи над на https://developer.gocardless.com/getting-started/api/staying-up-to-date-with-webhooks/?lang=php#building-a-webhook-handler

Вы хотите сделать что-то вроде

<?php 
// We recommend storing your webhook endpoint secret in an environment variable 
// for security, but you could include it as a string directly in your code 
$token = getenv("GC_WEBHOOK_SECRET"); 

$raw_payload = file_get_contents('php://input'); 

$headers = getallheaders(); 
$provided_signature = $headers["Webhook-Signature"]; 

$calculated_signature = hash_hmac("sha256", $raw_payload, $token); 

if ($provided_signature == $calculated_signature) { 
    // Process the events 

    header("HTTP/1.1 200 OK"); 
} else { 
    header("HTTP/1.1 498 Invalid Token"); 
} 
Смежные вопросы