Django csrf token + Angularjs

Pre*_*eom 64 javascript python django angularjs

我使用mod_wsgi在apache服务器上运行django,以及直接由apache服务的angularjs应用程序,而不是django.我想对django服务器进行POST调用(运行rest_framework),但我遇到了csrf令牌的问题.

有没有办法从服务器设置令牌而不{% csrf token %}作为模板的一部分(因为这些页面不通过django)?

  1. 我希望能够通过GET请求获取csrf令牌作为cookie.
  2. 我希望能够使用csrf令牌cookie值向django服务器发出POST请求.

Ye *_*Liu 111

Django和AngularJS都已经拥有CSRF支持,你的部分非常简单.

首先,您需要在Django中启用CSRF,我相信您已经这样做了,如果没有,请关注Django doc https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax.

现在,Django将csrftoken在第一个GET请求中设置一个cookie ,并期望X-CSRFToken在以后的POST/PUT/DELETE请求中使用自定义HTTP头.

对于Angular,它期望cookie命名XSRF-TOKEN并将使用X-XSRF-TOKEN标题执行POST/PUT/DELETE请求,因此您需要进行一些调整以使两者相互依赖:

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
Run Code Online (Sandbox Code Playgroud)

在你的js代码中的某处添加以上两行,module.config()块是一个很好的地方.

而已.

注意:这是针对角度1.1.5,旧版本可能需要不同的方法.

更新:

由于角度应用程序不是由django提供的,为了让cookie设置,角度应用程序需要首先对django执行GET请求.

  • 我在login/api中获取了Set-Cookie标头,这是POST.我什么时候应该拨打GET请求? (2认同)

Nik*_*luk 60

var foo = angular.module('foo', ['bar']);

foo.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
Run Code Online (Sandbox Code Playgroud)

所有使用$ http的模块服务和控制器都将使用csrf令牌发送请求.


Pre*_*eom 11

在搜索之后,对我有用的是这篇文章,其中包含以下代码:

angular.module( '[your module name]',
    ... [some dependencies] ...
    'ngCookies',
    ... [other dependencies] ...
)
.run( function run( $http, $cookies ){

    // For CSRF token compatibility with Django
    $http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken');
})
Run Code Online (Sandbox Code Playgroud)

这当然是在通过django服务器的GET请求获取cookie之后.

我也在这里查看了其他一些答案,包括Ye Liun,但在官方文档中找不到任何指定更改$ httpProvider上xsrf的默认选项的内容,除了这个拉取请求对我不起作用我写这篇文章的时间.