2016-03-09 180 views
7

我想使用Vue.js做一些POST方法到我用RANGA的Api創建的Django Rest框架。問題是,我發佈時遇到了CSRF Failed: CSRF token missing or incorrect.錯誤。但我可以看到csrf cookie,並將其添加到標題中。Django Rest框架,CSRF和Vue.js

這裏是我的設置:

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

這裏是我的Vue.js配置:

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

而這裏的標題的相關部分被髮送的:

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/ 

正如你可以看到,Cookie.csrf和HTTP_X_CSRFTOKEN標題匹配

我真的很難過。有什麼建議麼?

+1

您使用什麼'CSRF_HEADER_NAME'設置?我知道'HTTP_X_CSRFTOKEN'發送時應該是'X-CSRFTOKEN',因爲django通常將它格式化爲它的內容:https://docs.djangoproject.com/en/1.9/ref/settings/#csrf-header-名稱 – Nevertheless

+1

你有你的應用程序在同一個域名?或者你在使用CORS? –

+0

Yerko Palma是對的,它也可能是同源請求策略或CSRF_COOKIE_HTTPONLY設置的問題。 – Nevertheless

回答

8

所以我發佈這個作爲答案來關閉這個問題。

問題是因爲根據請求發送了錯誤的CSRF標頭名稱。根據文檔:

如同在request.META其他HTTP頭,在標題名稱接收 從服務器通過轉換所有字符 大寫,用下劃線替換任何連字符,並添加 「HTTP_歸一化'這個名字的前綴。例如,如果您的客戶端發送 'X-XSRF-TOKEN'標頭,則該設置應爲'HTTP_X_XSRF_TOKEN'。

另外,我在這裏要參考my question,它累積了幾個可能導致Django中出現CSRF Failed: CSRF token missing or incorrect.錯誤的問題。