Как-то раз передо мной стояла задача сделать подтверждение номера телефона. И, так как у меня совсем нет звездочек на гитхабе (и инвайта на хабре), было принято решение сделать гем.
В качестве смс-шлюза был выбран сервис 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 когда была отправлена последняя смска
На этом все. Спасибо за внимание.
Автор: kaikash