PHP Twilio RequestValidator возвращает false на всех конечных точках

Так что я действительно не знаю, в чем здесь проблема, я пробовал много вещей, но я не могу заставить хэши запросов 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

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

$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-адрес — это точный 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?


person Adam McGurk    schedule 11.07.2019    source источник


Ответы (1)


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

Когда Twilio отправляет запрос GET на мой сервер, вы не должны передавать параметры GET в качестве третьего параметра методу проверки в классе 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;
}

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

person Adam McGurk    schedule 19.07.2019