Twilio - X-Twilio-Signature - 传入请求验证

Posted

技术标签:

【中文标题】Twilio - X-Twilio-Signature - 传入请求验证【英文标题】:Twilio - X-Twilio-Signature - Incoming request Validation 【发布时间】:2016-11-03 07:44:59 【问题描述】:

我使用下面的代码来验证传入的请求,如果它真的来自 Twilio。

网址是,

http://example.xom/twilio/getCallForwardResponse/phoneId=1&orgId=1&Called=%2B16032944666&ToState=NH&CallerCountry=US&Direction=inbound&CallerState=NH&ToZip=03801&CallSid=CA3070631fb96644ca8cb6e3ad4ffe75d5&To=%2B16032944666&CallerZip=03038&ToCountry=US&ApiVersion=2010-04-01&CalledZip=03801&CalledCity=PORTSMOUTH&CallStatus=ringing&From=%2B17037750000&AccountSid=ACASN

我们使用 get & POST 方法。

我们得到期望的签名如下,

String expectedSignature = request.getHeader("X-Twilio-Signature");

请求的 URl 是,

    String serverUrl = request.getRequestURL().toString()+"/"+request.getQueryString();

// Since we use GET, it will be empty and it is working fine.
Map<String,String> tempParams = new HashMap<String,String>();

TwilioUtils util = new TwilioUtils("AUTH_TOKEN_OF_USER");
                    boolean validationResult = util.validateRequest(expectedSignature, serverUrl, tempParams);

对于 POST,它不起作用。 POST 代码,

------------ 编辑 ---------

    // Check twilio header ...
    String expectedSignature = request.getHeader("X-Twilio-Signature");

    // These are the post params twilio sent in its request
    Map<String, String> params = null;

    String serverUrl = null;
    serverUrl = PROTOCOL + "://" + request.getServerName() + request.getRequestURI() + "?" + request.getQueryString();
    if (request.getMethod().equalsIgnoreCase("POST")) 
       params = new HashMap<String, String>();
       Enumeration<String> reqParams = request.getParameterNames();
       LOGGER.info("NUMBER OF PARAMS ===>>>> " + request.getParameterMap().size());

       int i = 1;
       while (reqParams.hasMoreElements()) 
       String paramName = reqParams.nextElement();
       String paramValue = request.getParameter(paramName);

       LOGGER.info("KKKKK KEY is , value is  count ", paramName, paramValue, i);

       params.put(paramName, paramValue);
       i = i + 1;
      

       String queryString = request.getQueryString();

       if (! StringUtils.isEmpty(queryString)) 

          String[] parameters = queryString.split("&");
             for (String parameter : parameters) 
                String[] keyValuePair = parameter.split("=");
                params.remove(keyValuePair[0]);
                LOGGER.info("===>>>> Removing KEY  ", keyValuePair[0]);
             
          
          LOGGER.info("NUMBER OF PARAMS COUNT FINAL ===>>>> " + params.size());
        


 TwilioUtils util = new TwilioUtils(authToken);
                    boolean validationResult = util.validateRequest(expectedSignature, serverUrl, params);

它总是返回 false。我是不是做错了什么。

【问题讨论】:

【参考方案1】:

我建议在创建 serverUrl 后输出它。

基于此: HttpServletRequest to complete URL

似乎 getQueryString() 不包括 ?您需要自己添加。

---编辑---

在您最初的问题中,您说您正在做的事情。如果您正在发布帖子,请 Map tempParams = new HashMap();不正确,因为您正在创建一个空白地图并没有实际捕获帖子参数。

尝试: 映射参数 = RestContext.request.params; (How to get SMS request via twilio)

映射 tempParams = getAllRequestParams(httpRequest); (Twilio - Validating Incoming Callback Request - Java)

根据第二个答案,您设置的任何查询参数(您的回发网址是否在您的 twilio 控制台或代码中有 ?something=something ?)似乎都需要包含在 serverUrl 中,但删除了 trom tempParams。

【讨论】:

是的,我已经注意到并尝试过。但还是越来越假。我没有为 post param map 传递任何东西。对吗? 这适用于 GET 但不适用于 POST。我按照***.com/questions/34098140/… 中的说明进行了尝试。但是,仍然是假的。 在您的问题中,您说“我们使用 get 方法。”...为 POST 添加了更多内容。抱歉,没有确切的代码,因为我使用的是 C# 库。 抱歉,这是我们这边的问题。它工作正常。 嘿 Progone,感谢您在最近的一些 Twilio 标记问题上提供帮助。如果我们可以寄给您一件衬衫表示感谢,请发送电子邮件至 mspeir@twilio.com。干杯!

以上是关于Twilio - X-Twilio-Signature - 传入请求验证的主要内容,如果未能解决你的问题,请参考以下文章

如果 twilio 帐户状态已更改,请让 twilio 向应用程序发送信息

twilio停止接收消息

使用 Twilio Client 与 Twilio Video API 哪个更合适?

尝试将 Twilio 与 Meteor 一起使用,ReferenceError: Twilio is not defined

twilio中的导入错误

如何使用Twilio留下语音邮件?