【问题标题】:Is there a way to call a private/protected twilio function?有没有办法调用私有/受保护的 twilio 函数?
【发布时间】:2019-08-16 12:41:09
【问题描述】:

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

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

我已经尝试使用我在此处找到的 curl 文档: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);
};

【问题讨论】:

    标签: twilio twilio-api twilio-functions


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      嘿嘿。 ? 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
      

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

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

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

      希望这会有所帮助。 :)

      【讨论】:

      • 这帮助很大!谢谢,但是,我怎样才能获得 X-Twilio-Signature?有一个带有示例的指南,您可以与我分享。
      • 我认为创建 X-Twilio-Signature 将是一个挑战。他们有库代码,你可以深入了解这个签名是如何创建的。这里有几个链接:twilio.com/blog/how-to-secure-twilio-webhook-urls-in-nodejslaurentluce.com/posts/c-twilio-rest-and-twiml-helper-librarylaurentluce@github.com/laurentluce/twilio-cplusplus.git(不确定 laurentluce 的东西是否仍然有效)
      • 问题是如何将请求发送到受保护的函数(即我们不希望任何人都可以访问的函数)。如果一个受保护的函数需要一个签名,听起来它应该只被 Twilio webhook 使用,那么我们还有什么意思要保护我们的函数不被公众使用呢? Twilio 文档似乎没有回答这个非常基本的问题 - 肯定公开无服务器功能只会让它们被滥用吗?
      • 经过大量谷歌搜索并浏览文档后找到了答案。看我的回答:)
      猜你喜欢
      • 2015-09-22
      • 2012-05-06
      • 1970-01-01
      • 2011-05-27
      • 2011-09-20
      • 2011-07-09
      • 2011-03-15
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多