我有一个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']总是未定义的,我假设我必须以某种方式检索它,但找不到任何有关此过程如何工作的资源。
有人能指出我正确的方向吗?
答案 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。