2016-02-26 60 views
5

我從我的本地主機執行POST請求到遠程django api時收到CSRF令牌缺失或不正確的錯誤。CSRF令牌丟失或不正確。 Django + AngularJS

我對AngularJS設置:

.config(['$httpProvider', function($httpProvider){ 

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 

}]); 

但IM仍然得到CSRF令牌丟失或不正確錯誤。

我檢查哪些標題正在發送,顯然角度不發送HTTP_X_CSRFTOKEN

但我可以看到cookie csrftoken =發送了一些東西。

有誰知道發生了什麼事?

請求頭

POST /s/login/ HTTP/1.1 
Host: server.somewhere.io:8000 
Connection: keep-alive 
Content-Length: 290 
Pragma: no-cache 
Cache-Control: no-cache 
Accept: application/json, text/plain, */* 
Origin: http://localhost 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost/thesocialmarkt/ 
Accept-Encoding: gzip, deflate 
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6,pt-BR;q=0.4,pt;q=0.2 
Cookie: csrftoken=hiYq1bCNux1mTeQuI4eNgi97qir8pivi; sessionid=1nn1phjab5yd71yfu5k8ghdch2ho6exc 
+0

這是一個重複? http://stackoverflow.com/questions/18156452/django-csrf-token-angularjs –

+1

不是因爲我仍然有問題。 –

+0

你的django restframework設置是什麼? –

回答

1

由於@克里斯·霍克斯指出,這個計算器回答@Ye劉給出

由於角度應用不被Django的服務,爲了讓需要設置的Cookie爲 ,角度應用需要首先對django 進行GET請求。

我驗證了只要你不使http獲取請求,csrftoken cookie不會被設置。所以只有

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 

將無法​​正常工作。你首先需要做的,如果不是真正的,然後模擬HTTP請求django rest_framework

更新:您的意見促使我進一步研究它,請仔細閱讀本blog其中已經提到,

CLIENT端生成CSRF的令牌。讓客戶端生成併發送 相同的唯一祕密值,包括Cookie和自定義HTTP標頭中的 。考慮到一個網站只允許讀/寫自己的域的Cookie ,只有真正的網站可以在兩個 頭

因此,讓這種單一的請求第一次嘗試發送相同的值。

$http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken; 

你在哪裏注射$cookies控制器/服務。

如果有效,那麼可能會寫入interceptors將是不錯的選擇,並且可以幫助您進行調試。

我相信你使用的AngularJs版本至少有1個。2,請參閱本changeset 並在最近提交角http服務檢查CSRF與此代碼,

var xsrfValue = urlIsSameOrigin(config.url) 
      ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName] 
      : undefined; 
     if (xsrfValue) { 
      reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; 
     } 

所以這是必要的,你要發送同樣的道理,它存在於餅乾。

進一步分析使用瀏覽器的開發者工具來查看http請求的請求/響應並分析頭和cookie。

+0

我在頁面加載時做了一個get請求。所以我得到CSRFTOKEN的迴應。正如你可以在上面發佈的resquest頭文件中看到的那樣,cookie csrftoken = hiYq1bCNux1mTeQuI4eNgi97qir8pivi;被設置。當時正在發生的是當我嘗試做另一個請求時,django說我沒有發送令牌。我注意到頭HTTP_X_CSRFTOKEN沒有發送。 –

+0

Thx爲你提供幫助。但我想它只會在本地機器上運行,不會真正起作用。我會稍後將其上傳到服務器並進行測試。 –

0

如果您使用的$ HTTP在AngularJS爲Ajax請求,如果你正面臨任何CSRF令牌問題,那麼使用這個:

$http.defaults.xsrfCookieName = 'csrftoken'; 
$http.defaults.xsrfHeaderName = 'X-CSRFToken'; 
相關問題