Twilio-Ruby验证失败

时间:2014-06-11 04:46:44

标签: ruby-on-rails ruby ruby-on-rails-3 twilio

我正在使用twilio-ruby gem验证请求来自twilio,但它始终错误地取消了twilio请求。这是我到目前为止所拥有的

class CallsController < ApplicationController
    before_filter :authenticate_request

    private 

    # This action validates that the request are coming from twilio. It uses the twilio-ruby gem
    # to validate that the twilio signature, url, and params are correctly from twilio
    def authenticate_request
        twilio_signature = request.headers['HTTP_X_TWILIO_SIGNATURE']
        validator = Twilio::Util::RequestValidator.new(ENV['TWILIO_AUTH'])

        verified = validator.validate(request.url, params, twilio_signature)

        unless verified
            response = Twilio::TwiML::Response.new do |r|
              r.Say 'Unvalidated request'
              r.Hangup
            end
            render :xml => response.text
        end
    end
end

3 个答案:

答案 0 :(得分:2)

使用twilio_params = params.reject {| k,v | k.downcase == k}将适用于某些请求,有时Twilio确实在POST请求中包含非大写的参数(例如,在Gather响应之后发送数字时)。我发现request.POSTenv['rack.request.form_hash']对我有用:

所以,在上下文中:

class CallsController < ApplicationController
    before_filter :authenticate_request

    private 

    # This action validates that the request are coming from twilio. It uses the twilio-ruby gem
    # to validate that the twilio signature, url, and params are correctly from twilio
    def authenticate_request
        twilio_signature = request.headers['HTTP_X_TWILIO_SIGNATURE']
        twilio_params = request.POST
        validator = Twilio::Util::RequestValidator.new(ENV['TWILIO_AUTH'])

        verified = validator.validate(request.url, twilio_params, twilio_signature)

        unless verified
            response = Twilio::TwiML::Response.new do |r|
              r.Say 'Unvalidated request'
              r.Hangup
            end
            render :xml => response.text
        end
    end
end

答案 1 :(得分:1)

Twilio Evangelist在这里。

很难说为什么这对你不起作用 - 但我能够用你的代码复制同样的问题。我不确定它是否是同一个原因。如果您阅读Twilio specification for how this works,则URL将包含在安全哈希中以验证请求。

我使用nginx将流量定向到我的应用程序,该应用程序从端口80转发到端口3000.我的Twilio webhook是http://example.com/voice,但由于此服务器设置,我的应用程序正在接收http://example.com:3000/voice的网址。

您可以通过从URL中删除端口号来使其与Twilio请求匹配(还有其他方法,例如将URL硬编码到可能也有效的验证中):

content_type 'text/xml'
twilio_signature = request.headers['HTTP_X_TWILIO_SIGNATURE']
validator = Twilio::Util::RequestValidator.new(ENV['TWILIO_AUTH'])

url = request.url
url.slice! ":3000"

verified = validator.validate(url, params, twilio_signature)

unless verified
  response = Twilio::TwiML::Response.new do |r|
    r.Say 'Unvalidated request'
    r.Hangup
  end
  response.text
end

我无法确定这是否真的是您的问题,所以如果这没有帮助,您是否可以发布有关传入请求参数等的更多信息?但请注意不要发布您的实际网址或Twilio凭据!

希望这有帮助。

答案 2 :(得分:0)

如果从那时起有任何人遇到问题,那么修复就是来自rails的params不能与twilio所拥有的参数匹配

添加此行并将其放入验证功能,它应该可以正常工作

 twilio_params = params.reject {|k,v| k.downcase == k}