Angular, django и csrf
from http://docs.angularjs.org/api/ng. $http, он говорит, что мы должны установить заголовки по умолчанию, чтобы включить токен, поэтому я следую за ним.
мой код выглядит примерно так:
var myapp = angular.module('myapp', ['ngCookies', 'ui.bootstrap']).
config(['$routeProvider', function($routeProvider, $httpProvider, $cookies){
$routeProvider.
when('/', {
templateUrl: '/partials/home.html',
controller: HomeCtrl
}).
when('/game/:gameId/shortlist/create',{
templateUrl: '/partials/create-shortlist.html',
controller: CreateShortlistCtrl
}).
otherwise({redirectTo: '/'});
}]);
myapp.run(function($rootScope, $http, $cookies, $httpProvider){
$http.get('/api/get-current-user').success(function(data){
$rootScope.current_user = data;
$rootScope.current_team = $rootScope.current_user.team;
});
$http.get('/api/get-current-season').success(function(data){
$rootScope.current_season = data;
});
$rootScope.csrf_token = $cookies.csrftoken;
console.log($httpProvider.defaults.headers.common);
//$httpProvider.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
});
как вы можете видеть, я применил несколько подходов, но не смог установить заголовок с помощью токена csrf. две ошибки, с которыми я столкнулся, - это
Непринятая ошибка: неизвестный поставщик: $httpProviderProvider < - $HttpProvider
что я делаю неправильно?
Ответы
Ответ 1
Если вы используете AngularJS 1.1.3 или новее, вы можете использовать xsrfHeaderName
и xsrfCookieName
:
var myapp = angular.module('myapp', ['ngCookies', 'ui.bootstrap']).
config(['$routeProvider', function($routeProvider, $httpProvider, $cookies){
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
...
См. $location в документации 1.1.3.
Ответ 2
Вы можете использовать $httpProvider
только в config-методе. Но проблема в том, что вы не можете использовать $cookies
в config-методе. Там поддерживается только $cookiesProvider
.
Это описано (немного) в разделе Загрузка и зависимость модулей.
Что вы можете сделать, это установить заголовки во время выполнения, как это предлагается в angularjs.org docs
Итак, чтобы ваш пример работал, вы можете сделать следующее:
var myapp = angular.module('myapp', ['ngCookies', 'ui.bootstrap']).
config(['$routeProvider', function($routeProvider){
$routeProvider.
when('/', {
templateUrl: '/partials/home.html',
controller: HomeCtrl
}).
when('/game/:gameId/shortlist/create',{
templateUrl: '/partials/create-shortlist.html',
controller: CreateShortlistCtrl
}).
otherwise({redirectTo: '/'});
}]);
myapp.run(function($rootScope, $http, $cookies){
// set the CSRF token here
$http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
$http.get('/api/get-current-user').success(function(data){
$rootScope.current_user = data;
$rootScope.current_team = $rootScope.current_user.team;
});
$http.get('/api/get-current-season').success(function(data){
$rootScope.current_season = data;
});
});
И не забудьте включить файл angular-cookies.js
в свой html файл!
Ответ 3
Вот небольшая библиотека, которая могла бы сделать это более простым https://github.com/pasupulaphani/angular-csrf-cross-domain