使用 WSH 验证对 Plivo 的 REST 调用

Authenticating REST calls to Plivo using WSH

我的应用程序使用了我客户系统上注册的任何 WSH 活动脚本。这通常只表示 VBScript 和 JScript。有时 Python,很少使用 Perl。 但只有 VBScript 和 JScript 绝对可以安装在客户的系统上。现在我需要那个应用程序来发送短信。

我想我会使用纯 JScript 调用 Plivo API。没有外部库(即 jQuery),没有外部 application/server(即 NodeJS)。只是简单的 XMLHTTP 请求,因为我不知道我客户的系统上安装了什么,我不想让他们安装任何东西。

Plivo 的 API 文档几乎解释了如何做所有事情...除了身份验证部分!它只是声明您应该在每次调用时使用基本身份验证,使用您的 AUTHID 和 AUTHTOKEN。但是没有例子。

由于 Plivo 提供了一个 Python Helper 库,而我的开发环境恰好有 Python,我首先确保我可以顺利进行,所以我安装了他们的 helper 库,抓取了他们的 Python 代码示例,输入了我自己的 ID 和 Token,然后我成功地给自己发送了一条 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)

足够简单,而且效果很好。我认为将其转换为纯 JavaScript 需要 10 分钟(只是因为我打字速度慢)。好吧,几个hours/days之后,我仍然不能得到它到运行并且总是得到一个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() 语句参数

中包含 username/password

所以我将代码更改为:

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.

请注意,我的 ID/Token/Phone Numbers/URL 都很好,因为我可以在我的 Python 代码中使用它们。我在 JavaScript 中唯一无法模仿的是身份验证部分。

有 Plivo 经验的人可以帮助我吗?另外,请不要问我是否尝试过使用 NodeJS、jQuery 或其他一些外部库。我做到了,我使用 Python 进行测试。但是我需要使用我 知道 在我客户的机器上可用的唯一工具来实现它,那就是 JScript。

好吧,让这个问题酝酿了几天之后,我今天早上 return 解决了这个问题,并在几分钟内解决了它。问题出在我指定的 URL 上:我从未意识到我在 URL 的最后一个“/Message”部分之前有一个额外的 space,这显然导致 REST 调用失败.

所以我修复了它,但我仍然无法接到工作电话:我收到了 200 状态(这是一个成功的 return 代码)但是 API 说我应该收到一个 202... 此外,我的 phone 从未收到过短信。查看 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!!!"}'

希望以上内容可以让其他分心的编码人员免于我经历的痛苦时光...:)