Подпись в ruby ​​на php

Я создал 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));

Мой «секрет», настроенный в веб-перехватчиках формы, - это «тестирование». Но значения всегда разные. Кто-нибудь пробовал это?

Немного сложно точно понять, о чем вы спрашиваете, - это то, что приведенный пример в Ruby генерирует другую подпись для Laravel/PHP?

CD001 14.05.2019 17:16

Вы пытались сравнить два содержимого без их хеширования? Возможно, есть невидимые персонажи.

Alex83690 14.05.2019 18:51

@ CD001 на сайте typeform есть пример создания «подписи» для сравнения в запросе. Этот пример на рубине, а я написал на php. Код правильный? Моя проблема в том, что в запросе POST, отправляемом из typeform в api, заголовок в запросе «typerform-signature» всегда отличается.

rcnespoli 15.05.2019 02:14

@ Alex83690 Alex83690 typeform-signature поступает в заголовок запроса, и он уже был закодирован. Мне нужно создать подпись для сравнения.

rcnespoli 15.05.2019 02:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
4
310
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Перед запуском кода убедитесь, что вы правильно установили свой секрет с помощью 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.

rcnespoli 16.05.2019 17:09

Код: paste.debian.net/1081751

rcnespoli 16.05.2019 17:11

вы копируете JSON в почтальоне? Если это так, обратите внимание, что это не сработает. Я бы рекомендовал использовать что-то вроде Ngrok (ngrok.com) и настроить тестовый веб-хук в Typeform, чтобы вы могли протестировать исходный запрос от Typeform.

NordinZ 16.05.2019 18:56

Почему не работает почтальон? Я все равно попробую вашу рекомендацию.

rcnespoli 16.05.2019 19:55

Формат, который вы копируете/вставляете с веб-сайта, содержит пробелы, линии разрыва и т. д. В исходном запросе, преобразованном в строку, их нет. Кроме того, убедитесь, что вы превратили его в строку $data = (string) $request->getContent(); В вашем коде я вижу, что вы этого не делаете.

NordinZ 17.05.2019 08:30

не работает. Вот моя функция paste.debian.net/1081886. Это запрос (images.devs-on.net/Image/y9aMag37fIUnyRxA-Region.png), а это ответ (images.devs-on.net/Image/1GHgD0ZAV2kTcDym-Region.png).

rcnespoli 17.05.2019 19:02

Я снова протестировал решение, и оно работает. Вы можете подать заявку в нашу службу поддержки по адресу [email protected]. Направьте его мне (Нордину), и я помогу вам там.

NordinZ 20.05.2019 13:56

Сегодня я отправил электронное письмо с просьбой переслать вам билет.

rcnespoli 21.05.2019 01:30

Другие вопросы по теме