有没有办法调用 private/protected twilio 函数?

Is there a way to call a private/protected twilio function?

这是我第一次使用 twilio,我从新的 twilio-cli 开始,我创建了新项目来构建和部署 twilio 函数的后端,但我需要一些函数保密,而且我想通过他们特定的 api-endpoint 调用该函数,但是,我总是收到消息 "Unauthorized - you are not authenticated to perform this request"

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

我已经尝试使用我在此处找到的 curl 文档:https://www.twilio.com/docs/studio/rest-api/execution 但是示例的 none 执行该函数。

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);
};

嘿哟哟。这里是 Twilio 开发人员传道者。

如果您遵循 运行ning 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

仔细查看函数块中的运行时 Urls。这些是可用的端点。如您所见,bootstrap 项目包含两个 public 函数(/hello-world/private-message)。您可以使用 curl 或您的浏览器调用它们。

此外,还有一项受保护的功能(/sms/reply)。此功能可用于从 Twilio 内部调用。

这意味着受保护的函数需要有效的 Twilio 签名。您可以阅读有关 here 的内容。如果您连接例如Studio 调用它将起作用的函数,因为 webhook 包含 Twilio 签名。如果你想 curl 它你必须提供 X-Twilio-Signature header。

希望这对您有所帮助。 :)

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

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

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

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