Gửi mã OTP đến điện thoại để xác thực User sử dụng Twilio

Đăng ký tài khoản

Để bắt đầu thực hiện cần phải có một tài khoản Twilio: https://www.twilio.com/docs/sms/tutorials/two-factor-authentication-ruby-rails

Sau khi đăng ký thành công:

Vì đây là tài khoản free nên chỉ có thể gửi cho một vài số điện thoại mà bạn đã xác thực trước, click vào link xác thực số điện thoại để có thể test: https://www.twilio.com/console/phone-numbers/verified

Thiết lập ứng dụng

New 1 project mới:

rails new sms-two-factor-Authentication

Cài đặt gem:

gem "twilio-ruby"
gem "dotenv-rails"

Thiết lập biến môi trường bằng gem "dotenv-rails": tạo file .env ở thư mục root:

TWILIO_ACCOUNT_SID: "xxx"
TWILIO_AUTH_TOKEN: "xxx"
TWILIO_NUMBER: "xxx"

Lần lượt chạy ở terminal 3 lệnh export sau:

export TWILIO_ACCOUNT_SID=xxx
export TWILIO_AUTH_TOKEN=xxx
export TWILIO_NUMBER=xxx

Thực hiện

Sau khi đã chuẩn bị các thiết lập môi trường, thì tiếp đến thực hành:
Tạo Scaffold User: để xây dựng trước form đăng ký.

rails g scaffold User email:string phone_number:string

Thêm vào bảng User 3 cột sau: để lưu mã OTP và active User

rails g migration add_verification_code_to_users verification_code:string activated:boolean activated_at:datetime

Tiếp theo tạo 3 file sau ở thư mục lib:
lib/confirmation_sender.rb

module ConfirmationSender
  def self.send_confirmation_to(user)
    verification_code = CodeGenerator.generate
    user.update(verification_code: verification_code)
    MessageSender.send_code(user.phone_number, verification_code)
  end
end

lib/code_generator.rb

module CodeGenerator
  def self.generate
    rand(100000...999999).to_s
  end
end

lib/message_sender.rb

module MessageSender
  def self.send_code(phone_number, code)
    account_sid = ENV["TWILIO_ACCOUNT_SID"]
    auth_token  = ENV["TWILIO_AUTH_TOKEN"]
    client = Twilio::REST::Client.new(account_sid, auth_token)

    message = client.messages.create(
      from:  ENV["TWILIO_NUMBER"],
      to:    phone_number,
      body:  code
    )

    message.status == "queued"
  end
end

Thêm dòng sau vào config/application.rb để có thể sử dụng các file thư viện vừa tạo:

config.autoload_paths << Rails.root.join("lib")

Tiếp theo tạo confirmations_controller.rb

rails g controller confirmations new create

config routes

Rails.application.routes.draw do
  resources :users do
    resources :confirmations, only: %i|new create|
  end
end

Ở users_controller.rb #create

def create
    @user = User.new(user_params)
    if @user.save
      ConfirmationSender.send_confirmation_to(@user)
      flash[:success] = "User was successfully created."
      redirect_to new_user_confirmation_path(@user)
    else
      flash.now[danger] = "Create user failed."
      render :new
    end
  end

Ở confirmations_controller.rb

class ConfirmationsController < ApplicationController
  def new; end

  def create
    @user = User.find_by id: params[:user_id]
    if @user.verification_code == verification_params[:verification_code]
      @user.update_attributes(activated: true, activated_at: Time.zone.now)
      flash[:success] = "Authenticated user successfully"
      redirect_to @user
    else
      flash[:danger] = "Authenticated user failed"
      redirect_to :new
    end
  end

  private

  def verification_params
    params.require(:confirm).permit :verification_code
  end
end

Tiếp theo là tạo form để nhập mã xác thực app/views/confirmations/new.html.erb

<%= form_for :confirm, url: user_confirmations_path, method: :POST do |f|%>
  <%= f.label :verification_code %>
  <%= f.text_field :verification_code %>

  <%= f.submit "Submit"%>
<% end %>

Bước cuối cùng là chạy server và test:


Ở điện thoại mình cũng nhận được mã xác thực.



Kết quả:

Trên là hướng dẫn cơ bản để xác thực User bằng cách gửi mã OTP qua số điện thoại sử dụng Twilio. Trên trang tutorials của Twilio còn nhiều hướng dẫn khác, những ai là người mới làm quen với Twilio có thể tham khảo thêm ở đây https://www.twilio.com/docs/tutorials

Nguồn

https://www.twilio.com/docs/sms/tutorials/two-factor-authentication-ruby-rails