2014-06-11 2 views
1

twilio-ruby gem을 사용하여 요청이 twilio에서오고 있음을 확인하지만 twilio 요청을 항상 잘못 검증합니다. 여기 내가 지금까지 가지고있는 것입니다Twilio-Ruby 유효성 검사 오류가 발생했습니다.

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 

답변

1

Twilio 전도사는 여기에 있습니다.

왜 이것이 작동하지 않는지 알기는 어렵지만 코드에서 같은 문제를 재현 할 수있었습니다. 나는 그것이 같은 원인인지 모르겠다. Twilio specification for how this works을 읽으면 보안 해시에 URL이 포함되어 요청의 유효성을 검사합니다. 나는 포트 80에서 포트 3000 내 Twilio의은 webhook에 전달하는 내 응용 프로그램, 트래픽을 직접 nginx을 사용하고

http://example.com/voice이지만,이 때문에 서버 설정의 내 응용 프로그램은 http://example.com:3000/voice로 URL을 받고있다.

당신은 (도 작동 할 수는 검증에 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 

이것이 정확히 문제가되는지 확신 할 수 없으므로이 방법이 도움이되지 않는다면 들어오는 요청 매개 변수 등에 대한 자세한 정보를 게시 할 수 있습니까? 그래도 실제 URL이나 Twilio 자격 증명을 게시하지 않도록주의하십시오!

희망이 도움이됩니다.

0

사람은 그 이후 문제가, 수정은 레일에서 PARAMS가/일

이 줄을 추가하고 유효성 검사 기능에 넣어 가지고 twilio params 객체를 파라미터와 일치하고 작동해야하지 않는다는 것입니다 경우

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

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 
관련 문제