Я создал API для получения данных Typeform (опросы https://www.typeform.com/). Это работает нормально. Но в безопасных веб-перехватчиках https://developer.typeform.com/webhooks/secure-your-webhooks/ показывает пример того, как создать подпись в ruby для сравнения в запросе.
В laravel я использую это:
$body = $req->getContent();
$sig_internal = base64_encode(hash_hmac('sha256', 'testing', $body, true));
Мой «секрет», настроенный в веб-перехватчиках формы, - это «тестирование». Но значения всегда разные. Кто-нибудь пробовал это?
Вы пытались сравнить два содержимого без их хеширования? Возможно, есть невидимые персонажи.
@ CD001 на сайте typeform есть пример создания «подписи» для сравнения в запросе. Этот пример на рубине, а я написал на php. Код правильный? Моя проблема в том, что в запросе POST, отправляемом из typeform в api, заголовок в запросе «typerform-signature» всегда отличается.
@ Alex83690 Alex83690 typeform-signature поступает в заголовок запроса, и он уже был закодирован. Мне нужно создать подпись для сравнения.






Перед запуском кода убедитесь, что вы правильно установили свой секрет с помощью Typeform: Как настроить вебхук
Подробнее здесь: https://developer.typeform.com/webhooks/secure-your-webhooks/
Как только это будет сделано, давайте перейдем к коду. Я вставляю сюда то, что вам нужно сделать шаг за шагом:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class WebhookController extends Controller
{
public function index(Request $request){
// Get your data (toString) and the typeform signature
$data = (string) $request->getContent();
$typeformSignature = $request->header('typeform-signature');
// Set your key
$key = 'test'; // <-- In prod I recommend adding it to the .env file and referring it here
// Run your hash
$hashed = hash_hmac('sha256', $data, $key, $raw_output = TRUE);
// Encode to Base64
$base64 = base64_encode($hashed);
// Append to string
$endValue = "sha256 = ". $base64;
// This bit here will output stuff to your console if you are running artisan
error_log($endValue);
error_log($request->header('typeform-signature'));
// If it's good it should praise the good Bro, otherwise you are a bad bro. :)
if ($request->header('typeform-signature') === $endValue){
error_log('Well done bro!');
} else {
error_log('Sorry bro!');
}
}
}
это полезная нагрузка: paste.debian.net/1081749, а это typeform-signature: images.devs-on.net/Image/8OsxSPVwyQgzK0GD-Region.png Когда мы генерируем таким образом, как вы написали, и я тоже, всегда подпись отличается images.devs-on.net/Image/Ek76OmKQttKhqcBE-Region.png.
вы копируете JSON в почтальоне? Если это так, обратите внимание, что это не сработает. Я бы рекомендовал использовать что-то вроде Ngrok (ngrok.com) и настроить тестовый веб-хук в Typeform, чтобы вы могли протестировать исходный запрос от Typeform.
Почему не работает почтальон? Я все равно попробую вашу рекомендацию.
Формат, который вы копируете/вставляете с веб-сайта, содержит пробелы, линии разрыва и т. д. В исходном запросе, преобразованном в строку, их нет. Кроме того, убедитесь, что вы превратили его в строку $data = (string) $request->getContent(); В вашем коде я вижу, что вы этого не делаете.
не работает. Вот моя функция paste.debian.net/1081886. Это запрос (images.devs-on.net/Image/y9aMag37fIUnyRxA-Region.png), а это ответ (images.devs-on.net/Image/1GHgD0ZAV2kTcDym-Region.png).
Я снова протестировал решение, и оно работает. Вы можете подать заявку в нашу службу поддержки по адресу [email protected]. Направьте его мне (Нордину), и я помогу вам там.
Сегодня я отправил электронное письмо с просьбой переслать вам билет.
Немного сложно точно понять, о чем вы спрашиваете, - это то, что приведенный пример в Ruby генерирует другую подпись для Laravel/PHP?