2017-08-03 59 views
1

我想將數據發佈到django應用程序,我使用angularjs http發佈。當我發佈數據時,我收到了403條禁止。於是,我改變了我的角度腳本這樣:無法在angularjs中創建包含crsf的發佈請求

var app = angular.module('omCenterLoginApp',['ngCookies']); 
app.config(['$httpProvider', function ($httpProvider,$cookies) { 
     $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
     $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
}]) 

app.controller('omCenterLoginContr',function($scope,$http){ 
    $scope.login = function(){ 
     var user = $scope.username; 
     var password = $scope.password; 
     $http({ 
      method: 'POST', 
      url:'http://172.100.1.8:8080/api/test/', 
      data:{user:password}, 
     }).then(function successCallback(response){ 
       console.log(response.data) 
       },function errorCallback(response){ 
       console.log(response.data) 
      }) 
    } 
}); 

我說,

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

但是,當我試圖發佈它時,仍然有響應403錯誤。 我檢查了帖子http標題。其中沒有X-CSRFToken。

Accept:application/json, text/plain, */* 
Accept-Encoding:gzip, deflate 
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:2 
Content-Type:application/json;charset=UTF-8 
Host:172.100.1.8:8080 
Origin:http://172.100.1.8 
Pragma:no-cache 
Referer:http://172.100.1.8/login.html? 
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 

我angularjs版本:1.5.8

但是,當我試圖訪問URL http://172.100.1.8:8080/api/test/,I可以得到 響應。

HTTP請求是:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
Accept-Encoding:gzip, deflate 
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6 
Cache-Control:no-cache 
Connection:keep-alive 
Cookie:sessionid=jbg90n8118w6qhcmbom8txctui2s59ca; csrftoken=tBsTGiBtcgMOw8MFslu6v3UJEdSXkmYF 
Host:172.100.0.48:8080 
Pragma:no-cache 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 

的csrftoken是存在的。

非常感謝您的幫助。

+0

你可以檢查:是否存在cookie? –

+0

我有完全相同的問題,並且cookie確實存在但未被髮送。同一版本的AngularJs和一切。這裏有可能的解決方案的更新? – btm1

回答

0

除非您通過Django提供頁面,否則這是通過單頁應用程序使用CSRF的相當複雜的方式。 嘗試使用單一頁面應用程序命中Django API時使用其他形式的驗證,如令牌驗證或JWT驗證。這可以通過優秀的Django Rest Framework輕鬆實現。即使你不喜歡使用它,你也可以簡單地使用一些認證庫,如django-oauth。只是爲了測試,但是你可以使用csrf_exempt裝飾器來允許你的角度應用程序發送沒有csrf標記的請求(雖然你用這個代碼打開了漏洞)。它總是一個使用某種認證的好習慣。

0

檢查你的Django settings.py爲CSRF_COOKIE_SECURE它必須是假的,如果你不使用https,看看這個答案django-csrf-cookie-not-set

+0

CSRF_COOKIE_SECURE¶ 默認:False –

+0

很好,它們存在的cookie是什麼? –

0

所以我有完全相同的問題...的角度完全一樣的版本。我非常確定,爲了讓令牌通過更新版本的Angular通過頭文件,你需要通過這樣的攔截器來完成。

.factory('csrfInterceptor',['$cookies', function($cookies){ 
    var csrfInterceptor = { 
     request: function(config) { 
      if(config.method == 'POST'){ 
       config.xsrfCookieName = 'csrftoken'; 
       config.xsrfHeaderName = 'X-CSRFToken'; 
       config.withCredentials = true; 
       config.headers['X-CSRFToken'] = $cookies.get("csrftoken"); 
       debugger; 
      } 
      return config; 
     } 
    }; 
    return csrfInterceptor; 
}]); 

但是,我可以告訴你,這仍然沒有爲我工作,因爲現在它顯示在標題下,但我仍然得到一個403錯誤。我開始懷疑請求者和請求者是否都需要https。

相關問題