使用Twilio的RequestValidator时,.Validate函数始终返回false。我不确定我是否遗漏了某些内容,或者我是否真的使用了不正确的信息。代码如下:
public ActionResult Text(string messageSid, string body, string to, string from)
{
var validator = new RequestValidator(AuthToken);
var parameters = new Dictionary<string, string>
{
{"Body", body},
{"From", from},
{"MessageSID", messageSid},
{"To", to}
};
var signature = Request.Headers["X-Twilio-Signature"];
var url = @"https://e5f89299.ngrok.io/Home/Text";
var b = validator.Validate(url, parameters, signature);
}
我按字母顺序输入参数,网址是我为Twilio提供的网址。签名看起来也正确。我错过了什么?
答案 0 :(得分:0)
Twilio开发者传道者在这里。
查看您的代码,您几乎做得很好,但事实证明,Twilio会向您的应用程序发出请求,传递的信息比您实际期望的要多得多,并且在回顾中,我很欣赏,也许我们的文档并没有真正证明这一点。
我已经创建了一个示例应用程序here,其中显示了一个与当前版本的API一起使用的示例。但基本上,这一切都归结为不是硬编码参数,你可以做类似于我在此做的事情:
public IActionResult SendMessage(IFormCollection fc)
{
// The Twilio request URL
const string url = "https://31123028.ngrok.io/api/Message";
// Initialize the validator
var validator = new Twilio.Security.RequestValidator(_authtoken);
// The X-Twilio-Signature header attached to the request
var twilioSignature = "empty";
StringValues headerValues;
if (Request.Headers.TryGetValue("X-Twilio-Signature", out headerValues))
{
twilioSignature = headerValues.FirstOrDefault();
}
Console.WriteLine(twilioSignature);
var parameters = fc.Keys.ToDictionary<string, string, string>(key => key, key => fc[key]);
var hashedParameters = GetHashedParameters(url, parameters);
Console.WriteLine(hashedParameters);
Console.WriteLine(validator.Validate(url, parameters, twilioSignature));
return Content("blah");
}
正如您所看到的,我循环遍历传入的所有参数,然后将它们添加到字典中,然后我将其传递到Validate
方法。
var parameters = fc.Keys.ToDictionary<string, string, string>(key => key, key => fc[key]);
我还添加了一些调试和方法来告诉我,我生成了与Twilio相同的哈希。
希望这可以帮助你。