PHP Twilio RequestValidator возвращает false на всех конечных точках - PullRequest
4 голосов
/ 11 июля 2019

Так что я действительно не знаю, в чем здесь проблема, я пробовал много вещей, но не могу найти совпадения с хэшами запросов Twilio.Позвольте мне объяснить.

Я решил реализовать экземпляр RequestValidator Twilio, чтобы запросы поступали от Twilio.Но после выполнения этого урока здесь: https://www.twilio.com/docs/usage/security?code-sample=code-validate-signature-of-request-1&code-language=PHP&code-sdk-version=5.x

Валидатор только возвращает false.Вот код, который я использовал:

$url = 'https://example.com/api/endpoint/to/endpoint/';
$request_params = $_REQUEST;
$twilio_validator = new RequestValidator('myauthtoken');
if (!$twilio_validator->validate($_SERVER['HTTP_X_TWILIO_SIGNATURE'], $url, $request_params)) {
    throw new CallException('Not from Twilio');
}

Несмотря на то, что URL является примером, именно так у меня отформатирован фактический URL ... без порта, базовой аутентификации или фрагмента.Только протокол, домен и путь с завершающим знаком "/".Кроме того, URL-адрес является точным VoiceURL, который я установил при настройке этого приложения Twilio (это вызов VoiceURL для одного из моих приложений Twilio).

Мой токен авторизации является токеном аутентификации для всей моей учетной записи

В параметрах запроса я уверен, что что-то напутал.Twilio делает GET-запрос к этой конечной точке, и я также попытался использовать суперглобальный $_GET, но безрезультатно.Я использую $_REQUEST здесь из-за этой проблемы: https://github.com/twilio/twilio-php/issues/510 и потому что я думал, что это будет лучшим выбором.Я также пытался использовать file_get_contents('php://input') для той же самой проблемы (хэши не совпадают, в конечном счете).

Я даже разветвил и открыл PR в PHP SDK, чтобы немного обновить класс, просто чтобы увидетьесли бы я мог больше учиться ... так что я знаю класс и его методы довольно хорошо ... Я просто не вижу своей проблемы.

Что я делаю не так, чтобы сделать это такчто RequestValidator не проверяет, что запросы от Twilio поступают от Twilio?

1 Ответ

0 голосов
/ 19 июля 2019

Итак, после долгих исследований и работы с помощью Twilio, я нашел ответ на свой вопрос.

Когда Twilio отправляет запрос GET на мой сервер, вы не должны передавать параметры GET в качестве третьего параметра в метод validate класса RequestValidator. Когда Twilio отправляет GET-запрос на ваш сервер, проверка на самом деле должна выглядеть следующим образом:

// this is the interesting part...you don't even set the pathname on the domain... 
// EVEN IF YOU THE PATHNAME IS SET IN YOUR VOICE URL. 
// This is because of the different way the RequestValidator handles GET and POST params
$domain = 'https://example.com'; // make sure to add no trailing '/'

// setting up the RequestValidator
$twilio_validator = new RequestValidator('myauthtoken');

// figuring out if the request is from twilio
$is_from_twilio = $twilio_validator->validate(

    // the signature header that Twilio sends
    $_SERVER['HTTP_X_TWILIO_SIGNATURE'], 

    // The domain name CONCATENATED to the Request URI. $_SERVER['REQUEST_URI'] holds everything that comes after the domain name in a URL (pathname, query parameters, and fragment)
    $domain.$_SERVER['REQUEST_URI']

    // if the request is a get request, as mine are, there is no need for the third parameter

);

// resolving the response
if (!$is_from_twilio) {
    echo 'Not from Twilio';
    exit;
}

Обратитесь к комментариям в коде для более глубокого обсуждения кода на работе здесь.

...