gocardless PHP подпись hmac не соответствует

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

Итак, я сгенерировал тест веб-перехватчика в песочнице, и он выдает мне тело запроса и заголовки в том виде, в каком он был отправлен.

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

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

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

 $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 возвращать сырые и кодировать его в base64 ... но безуспешно.

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

Заранее спасибо!


person Joaquin Javi    schedule 31.07.2016    source источник


Ответы (2)


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

person Joaquin Javi    schedule 31.07.2016
comment
Не могли бы вы пояснить, что вы имеете в виду под неминифицированным? Может быть, вам пригодится пример. - person guival; 03.11.2016
comment
Я копировал, вставляя объект, отправленный веб-перехватчиком goocardless, почтальону и отправлял его на мою конечную точку для имитации получения веб-перехватчиков, в тесте панели GC отображается ответ веб-перехватчика (для лучшего чтения), а подпись не соответствует, потому что длина будет разные, они отправляют минимизированный запрос, что означает отсутствие пробелов! - person Joaquin Javi; 03.11.2016
comment
Понял, спасибо. Я думал, вы имели в виду, что были также разрывы строк или что-то в этом роде. Тем не менее, полезно знать, что пробелов вообще не должно быть. - person guival; 03.11.2016
comment
Пожалуйста ! Я знаю, это звучит глупо ... Но мне потребовалось несколько часов, чтобы понять, что случилось! - person Joaquin Javi; 03.11.2016

Мы обновили нашу документацию для разработчиков, и вы можете найти пример проверки подписи веб-перехватчика по адресу 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");
}
person Andrew Farrell    schedule 16.09.2016