2016-03-09 21 views
7

Sto provando a utilizzare Vue.js per eseguire alcuni metodi POST sul mio REST Api che ho creato con Django Rest Framework. Il problema è che sto ricevendo l'errore CSRF Failed: CSRF token missing or incorrect. quando pubblico. Ma posso vedere il cookie csrf e viene aggiunto alle intestazioni.Django Rest Framework, CSRF e Vue.js

Ecco le mie impostazioni:

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

Ecco il mio config Vue.js:

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

Ed ecco la parte rilevante delle intestazioni che sono stati inviati:

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/ 

Come si può vedere, Cookie.csrf e l'intestazione HTTP_X_CSRFTOKEN corrisponde a

Sono davvero perplesso. Eventuali suggerimenti?

+1

Quale impostazione di 'CSRF_HEADER_NAME' si utilizza? So che 'HTTP_X_CSRFTOKEN' dovrebbe essere' X-CSRFTOKEN' quando lo si invia, perché django lo formatta convenzionalmente all'interno del suo budello: https://docs.djangoproject.com/en/1.9/ref/settings/#csrf-header- nome – Nevertheless

+1

hai le tue app nello stesso dominio? o stai usando CORS? –

+0

Yerko Palma ha ragione, potrebbe anche essere un problema con la politica di richiesta dell'origine stessa o l'impostazione 'CSRF_COOKIE_HTTPONLY'. – Nevertheless

risposta

8

Quindi sto postando questo come una risposta per chiudere la domanda.

Il problema era dovuto al nome dell'intestazione CSRF errato inviato su richiesta. Secondo la documentazione:

Come con altre intestazioni HTTP in request.META, il nome di intestazione ricevuto dal server è normalizzato convertendo tutti i caratteri in maiuscolo , sostituendo eventuali trattini di sottolineatura, e l'aggiunta di un 'HTTP_ 'prefisso al nome. Ad esempio, se il client invia un'intestazione "X-XSRF-TOKEN" , l'impostazione deve essere "HTTP_X_XSRF_TOKEN".

Anche io sto lasciando qui un riferimento a my question, che si accumula una serie di problemi che possono portare a CSRF Failed: CSRF token missing or incorrect. errore di Django.

Problemi correlati