Аутентификация вызовов REST в Plivo с использованием WSH

Мое приложение использует любой из активных сценариев WSH, зарегистрированных в системах моих клиентов. Обычно это означает только VBScript и JScript. Иногда Python, редко Perl. Но только VBScript и JScript абсолютно точно будут установлены в системе клиента. И теперь мне нужно это приложение для отправки SMS-сообщений.

Я решил, что вызову Plivo API, используя чистый JScript. Никаких внешних библиотек (например, jQuery), никаких внешних приложений/серверов (например, NodeJS). Просто простые запросы XMLHTTP, потому что я не знаю, что установлено в системах моих клиентов, и я не хочу, чтобы они что-то устанавливали.

Документация по API Plivo довольно подробно объясняет, как делать все... кроме части аутентификации! В нем просто говорится, что вы должны использовать обычную аутентификацию при каждом вызове, используя свои AUTHID и AUTHTOKEN. Но для него нет примера.

Поскольку Plivo предоставляет вспомогательную библиотеку Python, а в моей среде разработки оказался Python, я сначала убедился, что все пройдет гладко, поэтому я установил их вспомогательную библиотеку, взял их образец кода Python, вставил свой собственный идентификатор и токен. , и мне удалось отправить себе SMS-сообщение:

import plivo

auth_id = "MY_AUTH_ID"
auth_token = "MY_AUTH_TOKEN"
p = plivo.RestAPI(auth_id, auth_token)

params = {
    'src': '15556667777',
    'dst' : '15557778888',
    'text' : u"Hello, how are you?"
}
response = p.send_message(params)

Достаточно просто, и это прекрасно работает. Я прикинул, что мне понадобится 10 минут, чтобы преобразовать это в чистый JavaScript (только потому, что я медленно печатаю). Что ж, несколько часов / дней спустя я все еще не могу запустить его и всегда получаю ответ об ошибке 401 (неавторизованный). Вот код, который я впервые попробовал:

var plivo_authID =    "MY_AUTH_ID";
var plivo_authToken = "MY_AUTH_TOKEN";
var plivo_msgURL =    "https://api.plivo.com/v1/Account/"+plivo_authID+" /Message";

var xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
xhr.open("POST", plivo_msgURL, false);
xhr.setRequestHeader("Authorization", "Basic " + btoa(plivo_authID + ":" + plivo_authToken));
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send('{"src": "15556667777", "dst" : "15557778888", "text" : "My first Plivo API test"}');

Это не удается в инструкции send(). Единственное предложение, которое я получил от службы поддержки Plivo, заключалось в том, чтобы включить имя пользователя/пароль в параметры оператора open().

Поэтому я изменил свой код на:

var plivo_authID =    "MY_AUTH_ID";
var plivo_authToken = "MY_AUTH_TOKEN";
var plivo_msgURL =    "https://api.plivo.com/v1/Account/"+plivo_authID+" /Message";

var xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
xhr.open("POST", plivo_msgURL, false, plivo_authID, plivo_authToken );
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send('{"src": "15556667777", "dst" : "15557778888", "text" : "My first Plivo API test"}');

Но это приводит к ошибке 401. Я выполнял базовую аутентификацию миллионы раз с кодом, подобным приведенному выше (особенно при вызове собственного API моего приложения!), но я просто не могу заставить его работать с Plivo.

Я пробовал разные комбинации RequestHeaders (включая добавление Content-Size), удаление btoa(), преобразование URL-адреса в архаичный синтаксис https://username:password@URL и так много других перестановок, что я не могу вспомнить их все. Все тот же результат: 401.

Обратите внимание, что все мои идентификаторы/токены/номера телефонов/URL-адреса хороши, поскольку я могу использовать их в своем коде Python. Единственное, что мне никак не удается воспроизвести в JavaScript, — это часть аутентификации.

Может ли кто-нибудь с опытом Plivo помочь мне? Кроме того, пожалуйста, не спрашивайте меня, пробовал ли я использовать NodeJS, jQuery или какую-либо другую внешнюю библиотеку. Да, я использовал Python для тестирования. Но мне нужно реализовать это, используя единственные инструменты, которые, как я известен, доступны на компьютерах моих клиентов, и это JScript.


person Filipus    schedule 19.09.2017    source источник


Ответы (1)


Хорошо, после того, как эта проблема кипела в течение нескольких дней, я вернулся к ней сегодня утром и решил ее в течение нескольких минут. Проблема была с URL-адресом, который я указывал: я никогда не осознавал, что у меня есть один лишний пробел перед последней частью «/ Message» URL-адреса, что, очевидно, приводило к сбою вызова REST.

Итак, я исправил это, но я все еще не мог заставить вызов работать: я получал статус 200 (который является успешным кодом возврата), но API заявил, что я должен получить 202... и, кроме того, SMS никогда не было получено на мой телефон. Просматривая API, я понял, что получаю точно такой же ответ и объекты, которые я должен был получить, если бы я выдал оператор GET... что было странно, поскольку мой код действительно выдавал POST.

Затем я понял, что забыл добавить обратную косую черту к своему URL-адресу ("/Message/"), из-за чего каким-то образом сервер Plivo ответил так, как если бы я выполнил оператор GET.

Итак, в конце концов, я изменил URL-адрес на:

var plivo_msgURL =    "https://api.plivo.com/v1/Account/"+plivo_authID+"/Message/";

и это было то.

Таким образом, полный правильный код для отправки SMS-сообщения:

var plivo_authID =    "MY_AUTH_ID";
var plivo_authToken = "MY_AUTH_TOKEN";
var plivo_msgURL =    "https://api.plivo.com/v1/Account/"+plivo_authID+"/Message/";

var xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0");
xhr.open("POST", plivo_msgURL, false, plivo_authID, plivo_authToken );
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send('{"src": "15556667777", "dst" : "15557778888", "text" : "My first SUCCESSFUL Plivo API test!!!"}'

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

person Filipus    schedule 27.09.2017