Angular, django и csrf - программирование
Подтвердить что ты не робот

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

что я делаю неправильно?

4b9b3361

Ответ 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 файл!