angular,django和csrf

时间:2013-05-21 06:33:56

标签: django angularjs csrf django-rest-framework

来自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

我做错了什么?

3 个答案:

答案 0 :(得分:21)

如果您使用AngularJS 1.1.3或更新版本,则可以使用xsrfHeaderNamexsrfCookieName

var myapp = angular.module('myapp', ['ngCookies', 'ui.bootstrap']).
  config(['$routeProvider', function($routeProvider, $httpProvider, $cookies){
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    ...

请参阅1.1.3文档中的$location

答案 1 :(得分:15)

您只能在config-method中使用$httpProvider。但问题是你不能在config-method中使用$cookies。只支持$cookiesProvider。 这在({3}}部分中描述了一下。

您可以按照Module Loading & Dependencies

中的建议在运行时设置标题

为了使您的示例正常工作,您可以执行以下操作:

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文件中!

答案 2 :(得分:0)

这是一个小型的lib,可以使这个更简单https://github.com/pasupulaphani/angular-csrf-cross-domain