我正在尝试将 Twilio 与 Google App Engine 结合使用。我目前正在尝试通过 SMS 消息验证来自 Twilio 的请求。我有一个自定义处理程序,其中包含以下 2 个方法。
from twilio.util import RequestValidator
class TwilioRequestHandler(BaseRequestHandler):
def twilio_request_validator(self):
return RequestValidator(AUTH_TOKEN)
def validate_request(self):
if not 'X-Twilio-Signature' in self.request.headers:
logging.error("X-Twilio-Signature was not in the request headers")
return False
return self.twilio_request_validator().validate(self.request.url, self.request.POST, self.request.headers['X-Twilio-Signature'])
当我的 TwiML 端点之一收到请求时,我会调用 self.validate_request()
来 self 的请求处理程序。这似乎总是返回 false。正如您从我上面的代码中看到的,这应该相当于调用 Twilio 的 RequestValidator(AuthToken).validate(self.request.url, self.request.POST, self.request.headers['X-Twilio-Signature'])
我认为在计算签名时可能不应该包含我收到的某些请求参数,因此我什至为一个请求获取参数,创建一个简单的脚本检查所有可能的情况组合,并将其与该请求的签名进行比较。他们都没有成功,所以我必须好奇我做错了什么,或者这是否可能是 Twilio 方面的问题。
最佳答案
您是否针对 Twilio 端点检查了请求 URL 上的协议(protocol)?
如果 Flask 仅配置为 HTTP,Heroku 显然会将 HTTPS 流量代理为 HTTP。 Flask 的 request.url 仍将以 http://
开头,即使 Twilio 指向以 https://
开头的 URL。这将消除哈希值。
关于python - 适用于 Python 的 Twilio RequestValidator 始终返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18755841/