开发者

Rails 3 and Twilio to do phone verification

I am building an app in Rails 3, using twilio to verify a businesses existance. Basically, when you create a new buisiness I randomly generate a 6 digit number and then call the business phone number with this verification code and the user needs to enter it back in the system to finish the signup process. I am h开发者_高级运维aving trouble finding any relevant examples as to how to get this set up. I've found this, but it seems horribly outdated and doesn't work with Rails 3 seemingly. The documentation for the twilio-rb gem is confusing as well.

Does anyone know of any examples or have any code samples that could point me in the right direction?


As I said in the comment on your question itself, I am the author of the twilio-rb gem you mention. Off the top of my head, I would implement a verifications resource that you post a telephone number to.

POST /verifications.voice { telephone_number: '+12125551234' }

In the create action use Twilio::Call.create to create a new call with Twilio

def create
  @verification = Verification.new params[:verification]

  if @verification.save
    Twilio::Call.create to: @verification.telephone_number, 
      from: YOUR_CALLER_ID, url: verification_url(@verification, format: :voice)
    # 201 created and return verification code etc
  else
    # Handle errors
  end
end 

You will also want to rescue any API errors that twilio-rb might raise. The url refers to the show action of the verification resource instance. Twilio will then dial the supplied telephone number, and when the call is connected will request the url, e.g. GET /verifications/1.voice so you'll need a show view that asks for the verification code and collects the digits with the <Gather> verb:

res.gather num_digits: 4, action: twilio_hack_verification_url(@verification, :format => :voice), method: 'POST' do |form|
  form.say 'Please enter the your 4 digit verification code'
end

Since Twilio currently does not implement the PUT verb, you'll to add a member to your resource

resources :verifications do
  member { post 'twilio_hack' }
end

Then in your controller update the object with the user input:

def twilio_hack
  @verification = Verification.find(params[:id]).tap do |v|
    v.user_input params['Digits']
    v.save
  end

  if @verification.confirmed?
    # handle success
  else
    # handle failure
  end

end

Finally in your model you'll need code that generates the verification code, and verifies if it is confirmed

class Verification < ActiveRecord::Base
  before_save   -> { self[:confirmed] = true if user_input == verification_code }, if: user_input
  before_create -> { self[:verification_code] = rand.to_s[2..5] }
end

This is all untested and off the top of my head with about 2 minutes thought, but it should get you started.


When you wish to verify a Business:

  • Generate a verification code.
  • Use the Twilio REST API to initiate an outbound call, passing a URL for a callback to a controller which will handle the verification logic. Docs at Twilio are here and an example is here.
  • This means that you need to pass the verification code into your controller via the callback URL. Use a non-resourceful route with a bound parameter. See here.

Write a controller that handles the call and processes the verification:

  • Emit TwiML that challenges the user to enter the verification code. I have found using Nokogiri to build the TwiML myself to be the most straightforward approach. (See the method phone_greeting in this simple app I wrote: here.)
  • If it's correct, flag the Business as verified, congratulate the user, and hang up.
  • If not, loop.

Hopefully that's enough information to point you in the right direction.


Have you considered using Twilio's Outgoing Caller IDs to help solve this problem?

When calling Twilio over REST to add a new caller id to your account, Twilio will return a 6 digit verification code (property ValidationCode) for you to display in your UI, and then Twilio will automatically call the number and prompt for the code. When the user verifies the number over the phone, their number will be added to your account's caller ids. You can then query Twilio for their phone number over REST (parameter PhoneNumber) to ensure the verification was successful.

See here for documentation:

Add a caller id: http://www.twilio.com/docs/api/rest/outgoing-caller-ids#list-post

Find a caller id: http://www.twilio.com/docs/api/rest/outgoing-caller-ids#list

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜