gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:11:03 26 4
gpt4 key购买 nike

我使用下面的代码来验证传入的请求,如果它真的来自 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 方法。

我们得到如下的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);

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

最佳答案

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

基于此: HttpServletRequest to complete URL

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

---编辑---

在您最初的问题中,您说您正在做 gets。如果是发帖,Map tempParams = new HashMap();是不正确的,因为您正在创建一个空白 map ,而不是实际捕获帖子参数。

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

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

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

关于Twilio - X-Twilio-Signature - 传入请求验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com