Pull to refresh

Подтверждение номера телефона, используя Ruby on rails и Twilio

Reading time2 min
Views9.1K
Как-то раз передо мной стояла задача сделать подтверждение номера телефона. И, так как у меня совсем нет звездочек на гитхабе (и инвайта на хабре), было принято решение сделать гем.

image

В качестве смс-шлюза был выбран сервис Twilio, ибо он удобный и недорогой. Потратив на это дело несколько часов, получился, как по мне, весьма удобный гем.

Чтобы установить его, надо добавить в гемфайл:

gem "twilio_phone_verification"

После чего выполнить команду:

bundle install

И

rails g twilio_phone_verification:install [USER_CLASS]

USER_CLASS это класс, для которого надо добавить проверку телефона. Note:надо, чтобы у данного класса было поле name, чтобы он смог отправит смску «Hello, {{name}} ...». Это создаст 2 файла:

config/initializers/twilio_phone_verification.rb конфиг файл, где надо ввести ключи и номер телефона из Twilio

TwilioPhoneVerification.configure do |config|
  config.account_sid = ENV.fetch("TWILIO_ACCOUNT_SID") # Paste account id here
  config.auth_token = ENV.fetch("TWILIO_AUTH_TOKEN") # Paste your twilio auth token here
  config.from = ENV.fetch("TWILIO_NUMBER") # Paste your twilio number here
end

и db/migrate/000000000000000_add_phone_to_users.rb миграция, которая создаст нужные поля:

class AddPhoneToUsers < ActiveRecord::Migration[5.0]
  def self.up
    add_column :users, :phone, :string
    add_column :users, :phone_confirmation_token, :string
    add_column :users, :phone_confirmed_at, :datetime
    add_column :users, :phone_confirmation_sent_at, :datetime
    add_index :users, :phone, unique: true
  end

  def self.down
    remove_column :users, :phone
    remove_column :users, :phone_confirmation_token
    remove_column :users, :phone_confirmed_at
    remove_column :users, :phone_confirmation_sent_at
  end
end

После чего выполнить команду:

rails db:migrate # rails 5
rake db:migrate # rails < 5

И добавить в модель консерн, чтобы добавились нужные методы:

class User < ActiveRecord::Base
  include TwilioPhoneVerification::Phonable
end

Это добавит 4 основных метода: phone_confirmed? возвращает true или false, в зависимости от того, подтвержден ли телефон.

send_phone_confirmation генерирует код и отправляет смску. Возвращает {success: true}, если смска отправилась, или false, если не отправилась. Каждый раз генерируется новая смска. И код может быть отправлен только 1 раз в минуту.

confirm_phone_by_code(code) возвращает true и верифицирует номер телефона, если код верный, иначе false.

confirm_phone верифицирует номер телефона без проверки кода.

Если метод возвращает false, то ошибка добавляется в .errors.

Также есть 2 таймстампа:

phone_confirmed_at когда был подтвержден телефон
phone_confirmation_sent_at когда была отправлена последняя смска

» Github repo

На этом все. Спасибо за внимание.
Tags:
Hubs:
Total votes 15: ↑13 and ↓2+11
Comments11

Articles