Есть ли способ вызвать частную / защищенную функцию twilio?

Я впервые использую twilio, и я начинаю с нового twilio-cli, и я создаю новый проект для создания и развертывания серверной части над функциями twilio, но мне нужно, чтобы некоторые функции оставались конфиденциальными, и я хочу вызвать эту функцию через их конкретную конечную точку api, но я всегда получаю сообщение «Неавторизовано - вы не авторизованы для выполнения этого запроса»

Это плагин, который я использую с 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

Мне просто нужно получить приветственное сообщение, это код функции:

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

person Joao Pixeles    schedule 16.08.2019    source источник


Ответы (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

Эти файлы приводят к следующим конечным точкам HTTP после запуска twilio serverless:deploy. (у вас будет другой домен).

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. Вы можете прочитать об этом здесь. Если вы подключаетесь, например, Studio для вызова функции будет работать, потому что веб-перехватчик включает подпись Twilio. Если вы хотите curl это, вы должны предоставить заголовок X-Twilio-Signature.

Надеюсь это поможет. :)

person stefan judis    schedule 16.08.2019
comment
Это очень помогает! спасибо, но как я могу получить X-Twilio-Signature? есть руководство с примером, которым вы можете поделиться со мной. - person Joao Pixeles; 16.08.2019
comment
Я думаю, что создание X-Twilio-Signature будет сложной задачей. У них есть код библиотеки, в котором вы можете покопаться, чтобы увидеть, как создается эта подпись. Вот пара ссылок: twilio.com/ blog / how-to-secure-twilio-webhook-urls-in-nodejs laurentluce.com/posts/c-twilio-rest-and-twiml-helper-library [email protected]/laurentluce/twilio-cplusplus.git (не уверен, что материал laurentluce все еще работает) - person jwallis; 28.10.2020
comment
Вопрос в том, как отправить запрос на защищенную функцию (т.е. функцию, которая не должна быть доступна абсолютно никому). Если защищенная функция требует подписи, которая, судя по ее звукам, должна использоваться только веб-перехватчиками Twilio, то как еще мы должны защищать наши функции от общественности? Документы Twilio, похоже, не дают ответа на этот очень простой вопрос - конечно, если оставить бессерверные функции общедоступными, они просто откроются для злоупотреблений? - person Dotl; 25.11.2020
comment
Нашел ответ после большого количества поисков в Google и просмотра документации. Смотрите мой ответ :) - person Dotl; 25.11.2020

Принятый ответ на самом деле не отвечает на вопрос.

Чтобы вызвать защищенную функцию, вы должны предоставить подпись в заголовке X-Twilio-Signature. Вот как создать такую ​​подпись (согласно официальной документации):

  1. Возьмите полный URL-адрес URL-адреса запроса, который вы указываете для своего номера телефона или приложения, от протокола (https ...) до конца строки запроса (все после?).
  2. Если запрос является POST, отсортируйте все параметры POST в алфавитном порядке (используя порядок сортировки в стиле Unix с учетом регистра).
  3. Просмотрите отсортированный список параметров POST и добавьте имя и значение переменной (без разделителей) в конец строки URL-адреса.
  4. Подпишите полученную строку с помощью HMAC-SHA1, используя свой AuthToken в качестве ключа (помните, что регистр вашего AuthToken имеет значение!).
  5. Base64 кодирует полученное хеш-значение.

Официальные документы: https://www.twilio.com/docs/usage/security#validating-requests

person Dotl    schedule 25.11.2020
comment
Оно работает! спасибо за спасение моего дня. - person Willjay; 22.01.2021