Twilio - X-Twilio-Signature - 传入请求验证
Twilio - X-Twilio-Signature - Incoming request Validation
我使用下面的代码来验证传入请求,如果它真的来自 Twilio。
url是,
我们使用 get & POST 方法。
我们得到如下的expectedSignature,
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);
它总是 returns 错误。我是不是做错了什么。
我建议您在创建 serverUrl 后输出它。
基于此:
getQueryString() 似乎不包括 ?并且需要自己添加。
---编辑---
在你原来的问题中你说你在做 gets。如果你正在做 posts,Map tempParams = new HashMap();不正确,因为您创建的是空白地图,并未实际捕获 post 参数。
试试看:
地图参数 = RestContext.request.params;
(How to get SMS request via twilio)
或
Map tempParams = getAllRequestParams(httpRequest);
()
根据第二个答案,看起来您设置的任何查询参数(您的 post 返回 url 在您的 twilio 控制台或代码中是否有 ?something=something?)需要包含在 serverUrl 中,但从 tempParams 中删除。
我使用下面的代码来验证传入请求,如果它真的来自 Twilio。
url是,
我们使用 get & POST 方法。
我们得到如下的expectedSignature,
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);
它总是 returns 错误。我是不是做错了什么。
我建议您在创建 serverUrl 后输出它。
基于此:
getQueryString() 似乎不包括 ?并且需要自己添加。
---编辑---
在你原来的问题中你说你在做 gets。如果你正在做 posts,Map tempParams = new HashMap();不正确,因为您创建的是空白地图,并未实际捕获 post 参数。
试试看: 地图参数 = RestContext.request.params; (How to get SMS request via twilio)
或
Map tempParams = getAllRequestParams(httpRequest);
(
根据第二个答案,看起来您设置的任何查询参数(您的 post 返回 url 在您的 twilio 控制台或代码中是否有 ?something=something?)需要包含在 serverUrl 中,但从 tempParams 中删除。