Использование защиты от подделки пакета django-twilio создает ошибку 403 - PullRequest
0 голосов
/ 12 октября 2019

Я использую пакет django-twilio для защиты от подделки django-twilio документы для защиты от подделки

У меня есть приложение для отправки текстовых сообщений django, которое используется для отправки автоматических сообщений непосредственно через мой мобильный телефонMessenger, а также с моего веб-сайта во время входа в систему. Когда DJANGO_TWILIO_FORGERY_PROTECTION = False, обе платформы, использующие мое приложение для текстовых сообщений django, работают.

Когда DJANGO_TWILIO_FORGERY_PROTECTION = True, работает только мессенджер мобильного телефона, и веб-сайт получает 403 Запрещено.

Как это можно исправить, поддерживая как можно большую безопасность и поддерживая одно и то же приложение как функциональное для мобильного телефона и веб-сайта.

Я знаю, что проблема заключается в том, чтобы сделатьс @twilio_view decorator

send-text.html

    <form action="{% url 'text-send' %}" enctype="multipart/form-data" method="POST">
    {% csrf_token %}
    <input type="text" name="Body" required>
    <input type="submit" >
    </form>

Вот мое приложение для отправки текстовых сообщений:

@twilio_view
def sendtext(request, reviewpk):
    if request.method == "POST":
        ACCOUNT_SID = settings.TWILIO_ACCOUNT_SID
        AUTH_TOKEN = settings.TWILIO_AUTH_TOKEN
        client = Client(ACCOUNT_SID, AUTH_TOKEN)

        message_body = request.POST['Body']
        client.messages.create(
           to= "+13231342344",
           from_="+14571342764",
           body=message_body
         )
        return confirm_things(request)

def confirm_things(request):  
    if 'HTTP_X_TWILIO_SIGNATURE' in request.META:
        resp = MessagingResponse()
        resp.message("good job message was sent")
        return HttpResponse(str(resp), content_type='text/xml')          
    return HttpResponseRedirect(reverse('dashboard'))  

urls.py

urlpatterns = [
    path('textsend/', views.sendtext, name='text-send'),
    path('dashboard/', views.dash, name='dash'),
]

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Евангелист разработчика Twilio здесь.

DJANGO_TWILIO_FORGERY_PROTECTION = True следует использовать только для запросов, поступающих от Twilio.

Вы должны аутентифицировать отправку пользовательской формы с помощью обычного сеанса (или любого другого) аутентификация, а также существующая защита CSRF. По сути, вам не следует использовать @twilio_view для каких-либо действий контроллера, которые не отвечают на Twilio.

0 голосов
/ 12 октября 2019

Попробуйте включить @csrf_exempt decorator

Импортируйте его from django.views.decorators.csrf import csrf_exempt

И затем в функцию

@csrf_exempt
@twilio_view
def sendtext(request, reviewpk):
    if request.method == "POST":
        ACCOUNT_SID = settings.TWILIO_ACCOUNT_SID
        AUTH_TOKEN = settings.TWILIO_AUTH_TOKEN
        client = Client(ACCOUNT_SID, AUTH_TOKEN)

        message_body = request.POST['Body']
        client.messages.create(
           to= "+13231342344",
           from_="+14571342764",
           body=message_body
         )
        return confirm_things(request)

Надеюсь, это поможет!

...