2015-12-08 6 views
0

Я обслуживаю API, который будет доступен с небольшим датчиком, отправляющим запрос POST с данными. Этот датчик имеет ограниченное программное обеспечение, и я хочу отключить защиту CSRF в представлении API.CSRF освобожден от REST View

Так я добавил декоратор:

url(
     regex=r'^beacons/$', 
     view=csrf_exempt(ScanListCreateAPIView.as_view()), 
     name='beacons' 
    ), 

К сожалению, когда я выполнить POST с моим датчиком, я все еще получаю 403 ошибку:

<h1>Forbidden <span>(403)</span></h1> 
    <p>CSRF verification failed. Request aborted.</p> 

    <p>You are seeing this message because this HTTPS site requires a 'Referer 
    header' to be sent by your Web browser, but none was sent 
. This header is 
    required for security reasons, to ensure that your browser is not being 
    hijacked by third parties.</p> 

    <p>If you have configured your browser to disable 'Referer' headers, please 
    re-enable them, at least for this site, or for HTTPS connections, or for 
    'same-origin' requests.</p> 

Я пытаюсь добавить заголовок «Referer:» в моем POST-запросе, но у меня все еще есть ответ 403, в котором упоминается, что CSRF не удалось.

Мой запрос:

POST /api/beacons HTTP/1.1 
Host: vincent.pythonanywhere.com 
Content-Type: application/json 
Accept: */* 
User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1) 
Content-Length: 597 

{"beacon":"aaa"," ... 

Тот же запрос прошел Повсеместно ротор работает нормально, с 201 ответ.

+0

DRF делает свой собственный материал CSRF, он жестко закодирован при использовании 'SessionAuthentication' и в противном случае отключен. Вы можете переключиться на другой механизм аутентификации. – knbk

+0

Я пробовал с 'authentication_classes = (BasicAuthentication,)' на мой взгляд, без изменений – bixente57

ответ

0

Вот решение DIABLE CSRF:

1- Как ФПИ делает свой CSRF с SessionAuth, вы должны указать в окне:

authentication_classes = (BasicAuthentication,) 

2- Тогда я не знаю, exacly why, но view=csrf_exempt(ScanListCreateAPIView.as_view()), в URL-адресах не работает. Вместо этого используйте сочетание фигурных скобок:

from braces.views import LoginRequiredMixin, CsrfExemptMixin 
class ScanListCreateAPIView(ListCreateAPIView, CsrfExemptMixin): 
    authentication_classes = (BasicAuthentication,) 
Смежные вопросы