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 Client 与 Twilio Video API 哪个更合适?
尝试将 Twilio 与 Meteor 一起使用,ReferenceError: Twilio is not defined