Если вам когда-либо потребуется связаться с пользователями вашего приложения по телефону, хорошей практикой будет убедиться, что введённый ими номер действительно принадлежит им. Давайте разберёмся, как проверять номера телефонов в приложении на Rails 5 с использованием API верификации телефонов Authy.
Для работы с этим материалом вам понадобятся:
— Аккаунт Twilio
— Приложение Authy, которое можно создать в консоли Twilio — вам потребуется API-ключ
— Установленные Ruby и Rails. Я использую последнюю версию Rails 5.1.2 и Ruby 2.4.1
Создайте новое Rails-приложение для этого проекта:
Нам нужно добавить несколько гемов, которые мы будем использовать в проекте. Откройте `Gemfile` и добавьте `authy` и `envyable`. Authy будет использоваться для верификации телефона, а envyable — для управления переменными окружения.
Установите гемы, затем инициализируйте envyable из командной строки:
Откройте `config/env.yml` и добавьте ваш API-ключ приложения Authy:
Теперь инициализируйте сам Authy, создав файл `config/initializers/authy.rb` и добавив в него следующий код:
На этом вся необходимая инициализация завершена, и мы можем приступить к созданию приложения.
Процесс верификации довольно прост:
— Пользователь вводит три блока информации:
— Номер телефона
— Код страны
— Способ верификации: голосовой звонок или SMS
— Наше приложение отправляет запрос в API для начала верификации
— Пользователь получает звонок или SMS с четырёхзначным кодом
— Затем он вводит этот код в форму в приложении
— Код отправляется в API вместе с номером телефона и кодом страны для проверки
— Если код верный, номер телефона пользователя считается подтверждённым
Нам понадобится контроллер, который будет отображать необходимые представления и выполнять работу по инициализации верификации и проверке номера телефона. Создайте контроллер с помощью команды:
Это создаст пять действий и пять представлений. Нам не нужны представления create и verify, так что их можно удалить. Также будут сгенерированы маршруты. Откройте `config/routes.rb`, удалите пять новых маршрутов и замените их на:
Это создаст пять маршрутов, которые можно посмотреть, выполнив команду `rails routes` в командной строке. Они выглядят так:
Действие `new` должно отображать пользователю форму, в которую он введёт номер телефона, код страны и выберет способ верификации: SMS или голосовой звонок.
Чтобы создать список кодов стран и интерфейс для поиска по странам, подключите JavaScript-хелперы форм Authy. Добавьте в `
` файла `app/views/layouts/application.html.erb` следующее:Теперь в файле `app/views/phone_verifications/new.html.erb` замените сгенерированный код на следующий:
Этот код настраивает форму для отправки трёх полей. Использование ID `»authy-countries»` означает, что `select_tag` будет обработан JavaScript-кодом Authy и превращён в список стран с возможностью поиска.
Также мы используем `telephone_field_tag` для создания HTML-поля ввода с типом `»tel»`, чтобы мобильные устройства показывали оптимизированную клавиатуру для ввода телефонных номеров.
Запустите сервер:
Теперь у нас есть форма для начала процесса, и нам нужно инициировать верификацию. Используя параметры, введённые в форму, мы сформируем запрос к API верификации телефонов Authy и отправим его. Если запрос успешен, мы покажем форму для ввода кода верификации, в противном случае вернёмся к исходной форме и покажем ошибку.
В файле `app/controllers/phone_verifications_controller.rb` замените пустой метод `create` следующим кодом:
Ключевая часть здесь — вызов `Authy::PhoneVerification.start`. Мы передаём параметры, собранные от пользователя, включая способ связи, номер телефона и код страны. Если ответ успешен, процесс верификации начнётся, иначе возникнет ошибка.
Мы уже добавили код для отображения ошибок, если что-то пойдёт не так. Эти строки в представлении обрабатывают это:
Обратите внимание, что мы сохраняем номер телефона и код страны в сессии, чтобы использовать их позже. В полном приложении эти данные сохранялись бы в модели пользователя или записи номера телефона в базе данных, а в сессии хранился бы только ID записи.
Теперь пользователю нужно ввести четырёхзначный код, который придёт в процессе верификации. Добавьте следующий код в `app/views/phone_verifications/challenge.html.erb`:
На этот раз ключевая часть — это запрос к `Authy::PhoneVerification.check`, куда передаются номер телефона и код страны, сохранённые ранее, а также код, введённый пользователем. Если ответ успешен, верификация прошла успешно, и мы можем очистить сессию и перенаправить пользователя на страницу успеха. В реальном приложении вы, скорее всего, отметили бы, что пользователь или запись номера телефона подтверждены, и сохранили бы это в базе данных.
Если код был неверным, мы просто снова покажем представление challenge, чтобы пользователь мог повторить попытку, если допустил ошибку.
Чтобы завершить работу, добавьте сообщение об успехе в `app/views/phone_verifications/success.html.erb`:
Перейдите по адресу http://localhost:3000/phone_verifications/new и введите корректные данные. Когда вы получите звонок или SMS, введите код верификации во вторую форму, и вы увидите сообщение об успешной проверке вашего телефона.
Вот так можно начать работу с API верификации телефонов Authy в Rails 5. Полный код этой статьи можно посмотреть на GitHub. Конечно, это приложение далеко от завершения — предстоит ещё много работы. Например:
— Сохранять номер телефона и статус его верификации в модели пользователя в базе данных
— Лучше обрабатывать ошибки, давая пользователям возможность повторно отправить запрос или проверить и обновить номер телефона
Если у вас есть вопросы или комментарии, не стесняйтесь обращаться. Оставьте комментарий ниже или напишите мне в Twitter.