【问题标题】:Authenticating REST calls to Plivo using WSH使用 WSH 验证对 Plivo 的 REST 调用
【发布时间】:2018-02-28 21:06:37
【问题描述】:

我的应用程序使用在我的客户系统上注册的任何 WSH 活动脚本。这通常意味着仅 VBScript 和 JScript。有时是 Python,很少是 Perl。 但只有 VBScript 和 JScript 是绝对肯定会安装在客户系统上的。现在我需要该应用程序来发送 SMS 消息。

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

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

由于 Plivo 提供了 Python Helper 库,而且我的开发环境中恰好有 Python,所以我首先确保一切顺利,所以我安装了他们的 helper 库,获取了他们的 Python 代码示例,放入我自己的ID 和 Token,我设法给自己发了一条短信:

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 分钟(只是因为我是一个慢打字员)。好吧,几个小时/几天后,我仍然无法让它运行并且总是得到一个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

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

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

【问题讨论】:

    标签: api restful-authentication jscript sms-gateway plivo


    【解决方案1】:

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

    所以我修复了它,但我仍然无法接听电话:我收到了 200 状态(这是一个成功的返回码)但 API 说我应该收到 202...从来没有在我的手机上收到过。查看 API,我意识到如果我发出 GET 语句,我会收到完全相同的回复和对象......这很奇怪,因为我的代码确实发出了 POST。

    然后我意识到我忘记在我的 URL ("/Message/") 中添加尾部反斜杠,这不知何故导致 Plivo 服务器响应就像我发出了 GET 语句一样。

    所以最后我把网址改成了:

    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!!!"}'
    

    希望以上内容可以让其他心烦意乱的程序员免去我所经历的数小时痛苦...... :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多