AngularJS + Django - 用于单独应用程序的csrf

时间:2013-10-29 11:00:47

标签: django angularjs

我有一个Django应用程序和一个在不同端点托管的Angular JS应用程序。显然,为了让XHR请求工作,我需要在Angular中设置csrf标记,这在Django服务Angular时很容易,但在独立时却不那么容易。

到目前为止,这是我的代码:

angular.module('App', [
    'ngCookies',
])
.run(['$rootScope', '$http', '$cookies', 
    function($rootScope, $http, $cookies){
        // Set the CSRF header token to match Django
        $http.defaults.headers.post['X-CSRFToken'] = $cookies['csrftoken'];

        // Bootstrap
        $http.get('http://127.0.0.1:8000/test/').success(function(resp){
            console.log($cookies['csrftoken']);
        });
    }
])

似乎$ cookies ['csrftoken']总是未定义的,我假设我必须以某种方式检索它,但找不到任何有关此过程如何工作的资源。

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

Cookie只能在同一个源上访问,因此从其他域访问不会通过cookie共享CSRF令牌,您将不得不找到另一种方式来引入cookie(例如使用Django的模板标记)。

其次,您的示例看起来喜欢尝试从$http.get()调用中读取Cookie。 $cookie服务从文档加载(存储document.cookie)时收集Cookie,并且无法从跨域的Ajax / XHR调用访问生成的Cookie。

答案 1 :(得分:0)

您可以使用:

app = angular.module("App", []);

app.run(function($http) {
    $http.defaults.headers.post['X-CSRFToken'] = $.cookie('csrftoken');
});

其中$.cookie来自jQuery Cookie plugin