用于验证传入的 Twilio 请求的装饰器

Decorator for validating incoming Twilio requests

我试图遵循这个非常直接的指南,了解如何防止非 twilio 请求到达我为传入的 twilio 消息设置的 webhook url。它基本上涉及复制他们作为装饰器开发的功能并将其应用于处理传入消息的视图。

https://www.twilio.com/docs/usage/tutorials/how-to-secure-your-django-project-by-validating-incoming-twilio-requests

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', ''))