Twilio и Rails. Часть 2 – Защита вашего Rails 4 приложения и отправка SMS/MMS

Автор: | 30.07.2026

Добро пожаловать во вторую часть нашей серии статей об интеграции Twilio с вашим Rails 4 приложением. В первой части мы рассмотрели процесс регистрации бесплатного аккаунта разработчика Twilio, получение телефонного номера и обработку входящего телефонного звонка. В этой статье я расскажу о:

— Защите ваших вебхуков, чтобы доступ к ним имел только Twilio

— Использовании REST API Twilio для отправки исходящих SMS и MMS

— Получении уведомлений о доставке сообщений от Twilio

В первой части этой серии я говорил о вебхуках и о том, как они являются основным механизмом, с помощью которого Twilio сообщает вашему приложению о входящих сообщениях или звонках. Поскольку эти вебхуки должны быть доступны в интернете, чтобы Twilio мог отправлять к ним запросы, важно защитить эти URL-адреса, чтобы запросы от не-Twilio клиентов отклонялись. Как раз об этом недавно написал мой коллега Фил Нэш в своей статье о том, как это сделать на Ruby с использованием Rack middleware. Давайте пройдем через процесс защиты вашего приложения с помощью этого нового Rack middleware.

Сначала вам нужно обновить Gemfile вашего приложения и убедиться, что вы используете версию twilio-ruby 3.12.0 или выше:

Затем выполните команду bundle install для обновления гема.

Теперь, чтобы Rack middleware работал корректно, ему нужно знать ваш Twilio Auth Token. При регистрации аккаунта Twilio создал уникальный идентификатор для вашего аккаунта (известный как Account SID) и аналог пароля (Auth Token). Они используются для программного доступа к API Twilio и позволяют вашему Rails-приложению подключаться к вашему аккаунту Twilio. Эти значения можно найти на вашей панели управления:

В Rails 4.1 появился новый конфигурационный файл secrets.yml, который можно использовать для хранения конфиденциальной информации вашего приложения. Ваши Account SID и Auth Token определенно относятся к этой категории. Чтобы воспользоваться secrets.yml, вам нужно использовать Rails 4.1. Вы можете проверить, какую версию Rails вы используете, выполнив команду rails —version. Если у вас версия ниже 4.0, вот руководство по обновлению с версии 3.2. Если у вас версия 4.0.x, следуйте шагам ниже. В противном случае переходите к следующему разделу.

Выполните следующие шаги, чтобы настроить secrets.yml в приложении на Rails 4.0. Также ознакомьтесь с этим полным руководством по обновлению вашего приложения с Rails 4.0 до Rails 4.1.

**1) Отредактируйте ваш Gemfile и добавьте следующий дескриптор версии для гема rails.**

**2) Обновите гем rails и его зависимости.**

После завершения создайте новый файл в папке config под названием secrets.yml и заполните его следующим YAML-кодом:

**3) Скопируйте ваш secret_key_base в secrets.yml.**

Когда вы впервые создали ваше Rails 4 приложение, для вас был сгенерирован секретный ключ. Пожалуйста, скопируйте это значение из файла initializers/secret_token.rb в secrets.yml.

Теперь, когда вы настроили ваше приложение с учетными данными Twilio, вы можете активировать Rack middleware для защиты маршрутов ваших вебхуков Twilio. Отредактируйте файл config/environments/production.rb и добавьте следующую строку:

Вы могли заметить в файле secrets.yml код ERB, который ссылается на объект ENV Rails. Многие популярные PaaS-провайдеры (например, Heroku) рекомендуют разработчикам приложений хранить конфигурационную информацию в переменных окружения. Имейте это в виду при развертывании вашего Rails-приложения в продакшене. Для целей разработки установите локальные переменные окружения. В терминале введите:

Теперь вы можете запустить локальный сервер и проверить, защищены ли ваши вебхуки. Запустите rails server и затем используйте curl для отправки POST-запроса на URL вашего голосового запроса:

Ой, что происходит? На первый взгляд может показаться, что вы не защитили свой маршрут, но это не так. Мы включили Rack Middleware только для *продакшена*. Остановите локальный сервер и перезапустите его в режиме продакшена:

Теперь попробуйте снова получить доступ к URL:

Ура! Вы успешно защитили свой вебхук.

В первой части мы узнали, как обрабатывать входящие телефонные звонки. Это здорово, когда пользователь инициирует общение с вашим приложением. Однако бывают случаи, когда вашему приложению нужно инициировать контакт с пользователями. Здесь на помощь приходит REST API Twilio. Давайте напишем код, который отправляет простое текстовое сообщение. Создайте новый контроллер под названием notifications_controller.rb со следующим кодом:

Теперь заполните действие notify. Сначала инициализируйте объект клиента, который можно использовать для отправки запросов к REST API Twilio:

Обратите внимание, что вы инициализируете этого клиента с помощью значений Account SID и Auth Token из файла secrets.yml. Похлопайте себя по плечу за то, что не поместили защищенные учетные данные в код. Затем отправьте SMS:

Пожалуйста, замените AAA на ваш номер телефона Twilio и BBB на номер телефона, который вы использовали для подтверждения вашего аккаунта Twilio. Вы можете увидеть список ваших подтвержденных номеров телефонов на странице Numbers > Verified Caller IDs. Наконец, верните простой текст с состоянием отправленного текстового сообщения:

Наконец, отредактируйте файл config/routes.rb, чтобы создать новый маршрут для этого контроллера и действия:

Вернитесь в терминал и перезапустите сервер Rails (флаг -e production не нужен, среда разработки подойдет). Протестируйте новый маршрут с помощью curl:

Если все прошло хорошо, ваш телефон завибрирует, и вы должны увидеть:

Отправка SMS — это здорово. Но знаете, что круче отправки SMS? Отправка MMS. Twilio недавно запустил поддержку MMS для номеров телефонов в США, и это так же просто, как добавление еще одного параметра в вызов функции. Чтобы узнать, поддерживает ли ваш номер телефона Twilio MMS, просто перейдите на страницу Numbers:

Все, что вам нужно сделать для отправки MMS, — это добавить еще один параметр в ваш вызов к REST API Twilio. Отредактируйте файл notifications_controller.rb и добавьте параметр media_url:

Перезапустите локальный сервер Rails и протестируйте его:

Вы должны увидеть знакомое лицо, которое будет вдохновлять вас продолжать:

Теперь, если вы отправляете важное сообщение, возможно, вы захотите точно знать, что оно было доставлено. Twilio предоставляет квитанции о доставке для отправленных вами сообщений, и вы можете использовать вебхуки, чтобы ваше Rails-приложение получало уведомления, когда сообщение успешно доставлено.

Первым шагом в настройке этого является передача вебхука Status Callback в Twilio при отправке сообщения. Twilio будет отправлять HTTP-запросы на этот URL по мере изменения статуса вашего сообщения. Отредактируйте файл notifications_controller.rb и измените код, который вы используете для отправки MMS, чтобы указать URL Status Callback, указывающий на маршрут /twilio/status:

Затем вам нужно реализовать этот новый маршрут. Создайте новое действие status в twilio_controller.rb:

Статус доставки вашего сообщения можно найти в параметре HTTP POST MessageStatus. В этом примере мы не делаем ничего интересного с этой информацией, но вы можете представить, как использовать эти данные для:

— Хранения статуса в базе данных

— Инициирования повторной отправки сообщения в случае сбоя

— Логирования неудачной доставки и уведомления администратора

Наконец, измените файл config/routes.rb, чтобы добавить маршрут:

Скопируйте домен, который предоставляет Ngrok, и используйте его для отправки запроса к вашему приложению с помощью curl:

Теперь посмотрите на вывод вашего сервера Rails. Вы должны увидеть несколько запросов. Первый запрос — это тот, который вы сделали к действию notify:

Следующий запрос от Twilio к вашему новому действию *status*. Twilio может сообщить вам несколько вещей о статусе вашего сообщения, надеюсь, вы увидите, что оно было отправлено.

И наконец, если сообщение успешно доставлено пользователю, Twilio передаст эту информацию:

В первой части мы рассмотрели процесс регистрации в Twilio, получение телефонного номера и создание Rails 4 приложения, которое может обрабатывать входящий телефонный звонок. Во второй части вы узнали, как:

— Защитить ваше приложение

— Отправлять текстовые и мультимедийные сообщения

— Получать уведомления от Twilio о статусе доставки сообщения

В заключительной части нашей серии статей об интеграции Twilio в приложение на Rails 4 мы рассмотрим, как можно использовать Twilio для обеспечения голосовой связи в реальном времени на веб-странице с помощью WebRTC и библиотеки Twilio Client JavaScript.

Весь код, который мы рассмотрели, доступен на Github. До новых встреч, счастливого кодинга!

*Обновление: Часть 3 опубликована. Ознакомьтесь с ней!*