用于验证传入的 Twilio 请求的装饰器
Decorator for validating incoming Twilio requests
我试图遵循这个非常直接的指南,了解如何防止非 twilio 请求到达我为传入的 twilio 消息设置的 webhook url。它基本上涉及复制他们作为装饰器开发的功能并将其应用于处理传入消息的视图。
from django.http import HttpResponse, HttpResponseForbidden
from functools import wraps
from twilio import twiml
from twilio.request_validator import RequestValidator
import os
def validate_twilio_request(f):
"""Validates that incoming requests genuinely originated from Twilio"""
@wraps(f)
def decorated_function(request, *args, **kwargs):
# Create an instance of the RequestValidator class
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN'))
# Validate the request using its URL, POST data,
# and X-TWILIO-SIGNATURE header
request_valid = validator.validate(
request.build_absolute_uri(),
request.POST,
request.META.get('HTTP_X_TWILIO_SIGNATURE', ''))
# Continue processing the request if it's valid, return a 403 error if
# it's not
if request_valid:
return f(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return decorated_function
不幸的是,在我将装饰器应用于处理传入消息的视图后,我立即收到此错误。
Traceback (most recent call last):
File "/home/jason/lib/python3.6/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/jason/lib/python3.6/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/jason/lib/python3.6/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jason/webapps/project/jason/jasonsproject/decorators.py", line 14, in decorated_function
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN'))
File "/home/jason/lib/python3.6/twilio/request_validator.py", line 66, in __init__
self.token = token.encode("utf-8")
Exception Type: AttributeError at /incomingsmsmessages/
Exception Value: 'NoneType' object has no attribute 'encode'
Request information:
USER: AnonymousUser
GET: No GET data
感谢您的帮助!
似乎 RequestValidator
不接受 None。这应该可以解决它:
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN', ''))
我试图遵循这个非常直接的指南,了解如何防止非 twilio 请求到达我为传入的 twilio 消息设置的 webhook url。它基本上涉及复制他们作为装饰器开发的功能并将其应用于处理传入消息的视图。
from django.http import HttpResponse, HttpResponseForbidden
from functools import wraps
from twilio import twiml
from twilio.request_validator import RequestValidator
import os
def validate_twilio_request(f):
"""Validates that incoming requests genuinely originated from Twilio"""
@wraps(f)
def decorated_function(request, *args, **kwargs):
# Create an instance of the RequestValidator class
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN'))
# Validate the request using its URL, POST data,
# and X-TWILIO-SIGNATURE header
request_valid = validator.validate(
request.build_absolute_uri(),
request.POST,
request.META.get('HTTP_X_TWILIO_SIGNATURE', ''))
# Continue processing the request if it's valid, return a 403 error if
# it's not
if request_valid:
return f(request, *args, **kwargs)
else:
return HttpResponseForbidden()
return decorated_function
不幸的是,在我将装饰器应用于处理传入消息的视图后,我立即收到此错误。
Traceback (most recent call last):
File "/home/jason/lib/python3.6/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/jason/lib/python3.6/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/jason/lib/python3.6/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/jason/webapps/project/jason/jasonsproject/decorators.py", line 14, in decorated_function
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN'))
File "/home/jason/lib/python3.6/twilio/request_validator.py", line 66, in __init__
self.token = token.encode("utf-8")
Exception Type: AttributeError at /incomingsmsmessages/
Exception Value: 'NoneType' object has no attribute 'encode'
Request information:
USER: AnonymousUser
GET: No GET data
感谢您的帮助!
似乎 RequestValidator
不接受 None。这应该可以解决它:
validator = RequestValidator(os.environ.get('TWILIO_AUTH_TOKEN', ''))