有没有办法调用私有/受保护的twilio函数?

时间:2019-08-16 12:41:09

标签: twilio twilio-api twilio-functions

这是我第一次使用twilio,我从新的twilio-cli开始,我创建了一个新项目,以通过twilio函数构建和部署后端,但是我需要某些函数保持私有,我想通过其特定的api端点调用该函数,但我总是收到消息“未经授权-您未通过身份验证才能执行此请求”

这是我与twilio-cli https://github.com/twilio-labs/plugin-serverless一起使用的插件,用于启动基本项目以部署到twilio。

我已经尝试使用在这里找到的c​​url文档:https://www.twilio.com/docs/studio/rest-api/execution,但是没有一个示例执行该功能。

curl -X POST 'https://serverless.twilio.com/v1/Services/ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Functions/ZHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
  -u ACXXXXXXXXXXXX:your_auth_token

我只需要接收一个hello world消息,这是该函数的代码:

exports.handler = function(context, event, callback) {
  const twiml = new Twilio.twiml.MessagingResponse();
  twiml.message("Hello World!");
  console.log("Track this");
  callback(null, twiml);
};

2 个答案:

答案 0 :(得分:2)

Heyooo。 ?Twilio开发人员布道者。

如果您通过运行twilio serverless:init遵循无服务器插件初始化过程,则您应该具有以下项目结构。

.
├── assets
│   ├── index.html
│   ├── message.private.js
│   └── style.css
├── functions
│   ├── hello-world.js
│   ├── private-message.js
│   └── sms
│       └──reply.protected.js
├── node_modules
├── package-lock.json
└── package.json

运行twilio serverless:deploy后,这些文件将导致以下HTTP端点。 (您将拥有另一个域)。

Deploying functions & assets to the Twilio Runtime

Account     SK6a...
Token       kegH****************************
Service Name    foo-2
Environment dev
Root Directory  /private/tmp/foo
Dependencies
Env Variables

✔ Serverless project successfully deployed

Deployment Details
Domain: foo-3513-dev.twil.io
Service:
   foo (ZS8...)
Environment:
   dev (ZE0...)
Build SID:
   ZB9...
Functions:
   [protected] https://foo-3513-dev.twil.io/sms/reply
   https://foo-3513-dev.twil.io/hello-world
   https://foo-3513-dev.twil.io/private-message
Assets:
   [private] Runtime.getAssets()['/message.js']
   https://foo-3513-dev.twil.io/index.html
   https://foo-3513-dev.twil.io/style.css

仔细查看功能块中的Runtime Urls。这些是可用的端点。如您所见,引导程序项目包含两个公共功能(/hello-world/private-message)。您可以使用curl或浏览器来调用它们。

此外,还有一个受保护的功能(/sms/reply)。此功能可用于从Twilio内部进行的呼叫。

这意味着受保护的函数需要有效的Twilio签名。您可以阅读有关here的信息。如果您连接例如Studio调用它将起作用的功能,因为Webhook包含Twilio签名。如果要curl,则必须提供X-Twilio-Signature标头。

希望这会有所帮助。 :)

答案 1 :(得分:0)

接受的答案实际上并未回答问题。

要调用受保护的函数,必须在X-Twilio-Signature标头中提供签名。这是创建此类签名的方法(根据官方文档):

  1. 从协议(https ...)到查询字符串末尾(在?之后的所有内容)中,获取您为电话号码或应用指定的请求URL的完整URL。
  2. 如果请求是POST,请按字母顺序对所有POST参数进行排序(使用Unix样式的区分大小写的排序顺序)。
  3. 遍历POST参数的排序列表,并将变量名称和值(不带分隔符)附加到URL字符串的末尾。
  4. 使用您的AuthToken作为密钥,用HMAC-SHA1对结果字符串进行签名(请记住,您的AuthToken的大小写很重要!)。
  5. Base64对所得的哈希值进行编码。

官方文档:https://www.twilio.com/docs/usage/security#validating-requests