def twilio_auth_required(func: Callable[..., HttpResponse]) -> Callable[..., HttpResponse]:
@functools.wraps(func)
def decorated_function(request: WSGIRequest, *args, **kwargs) -> HttpResponse:
auth_token = settings.TWILIO_AUTH_TOKEN or os.environ.get('TWILIO_AUTH_TOKEN')
if not auth_token:
log.error('TWILIO_AUTH_TOKEN is not configured; rejecting webhook request')
return HttpResponseForbidden()
request_validator = RequestValidator(auth_token)
absolute_uri = request.build_absolute_uri().replace('http:', 'https:', 1)
request_valid = request_validator.validate(
absolute_uri,
request.POST,
request.META.get('HTTP_X_TWILIO_SIGNATURE', ''),
)
if request_valid:
return func(request, *args, **kwargs)
return HttpResponseForbidden()
return decorated_function