2016-03-09 35 views
7

Próbuję użyć Vue.js do wykonania niektórych metod POST do mojego REST Api, które stworzyłem z Django Rest Framework. Problem polega na tym, że podczas wysyłania wiadomości pojawia się błąd CSRF Failed: CSRF token missing or incorrect.. Ale widzę plik cookie csrf i jest on dodawany do nagłówków.Django Rest Framework, CSRF i Vue.js

Oto moje ustawienia:

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
     'rest_framework.permissions.DjangoModelPermissions' 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.BasicAuthentication' 
    ) 
} 

Oto mój Vue.js config:

var csrftoken = Cookies.get('csrftoken'); 
Vue.http.headers.common['HTTP_X_CSRFTOKEN'] = csrftoken; 

A oto odpowiednia część nagłówków, które zostały wysłane:

Cookie:djdt=hide; tabstyle=raw-tab; sessionid=1gl533mrneudxw3l9l2vg0ja1yowwmeo; csrftoken=dN85bhztB1oVRov87BsUrWTM29Ff9sjn 
Host:127.0.0.1:8000 
HTTP_X_CSRFTOKEN:dN85bhztB1oVRov87BsUrWTM29Ff9sjn 
Origin:http://127.0.0.1:8000 
Referer:http://127.0.0.1:8000/agencies/6/add-profiles/ 

jak ty można zobaczyć, Cookie.csrf i nagłówek nagłówka HTTP_X_CSRFTOKEN

Naprawdę jestem zakłopotany. Jakieś sugestie?

+1

Jakie ustawienie "CSRF_HEADER_NAME" używasz? Wiem, że 'HTTP_X_CSRFTOKEN' powinno być' X-CSRFTOKEN' kiedy je wysyłasz, ponieważ django konwencjonalnie formatuje je wewnątrz jego odwagi: https://docs.djangoproject.com/en/1.9/ref/settings/#csrf-header- nazwa – Nevertheless

+1

czy masz aplikacje w tej samej domenie? czy używasz CORS? –

+0

Yerko Palma ma rację, może to być problem z polityką żądania o takim samym pochodzeniu lub ustawieniem "CSRF_COOKIE_HTTPONLY". – Nevertheless

Odpowiedz

8

Zamieszczam to jako odpowiedź, aby zamknąć pytanie.

Problem został spowodowany nieprawidłową nazwą nagłówka CSRF wysłaną na żądanie. Zgodnie z dokumentacją:

jak w przypadku innych nagłówków HTTP w request.META nazwa nagłówka otrzymał z serwera normalizuje się poprzez przekształcenie wszystkich znaków na wielkimi literami, zastępując wszelkie łączniki podkreślenia, i dodanie „HTTP_ "prefiks do nazwy. Na przykład, jeśli Twój klient wysyła nagłówek "X-XSRF-TOKEN" , powinno to być ustawienie "HTTP_X_XSRF_TOKEN".

także Wyjeżdżam tutaj odniesienie do my question, która gromadzi się kilka problemów, które mogą prowadzić do CSRF Failed: CSRF token missing or incorrect. błędu w Django.

Powiązane problemy