我正在使用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
答案 0 :(得分:2)
使用twilio_params = params.reject {| k,v | k.downcase == k}将适用于某些请求,有时Twilio确实在POST请求中包含非大写的参数(例如,在Gather响应之后发送数字时)。我发现request.POST
或env['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}