无模板Django + AJAX:Django的CSRF令牌在浏览会话期间是否得到更新?

tam*_*are 4 django ajax csrf django-csrf

我目前的设置是AngularJS + Django 1.5,我完全抛弃了Django模板引擎的使用(即后端几乎是一个API服务器).

由于我没有使用csrf_token模板标签,因此Django不会设置并发送csrftokencookie作为响应.根据官方文档的指示,ensure_csrf_cookie()装饰器应该用于强制装饰视图发送csrftokencookie.

我已将ensure_csrf_cookie()装饰器应用于视图,该视图提供了我的Web客户端在引导时调用的第一个GET请求.有了这个,我的Web客户端获得了CSRF令牌,因此允许将不安全的方法(例如POST)调用到服务器.

仅当CSRF令牌保持不变直到浏览会话结束时,上述设置才能正常工作.

问题: Django的CSRF令牌是否在浏览会话期间得到更新?如果'是',这是否意味着我需要将ensure_csrf_cookie()装饰器应用于我拥有的所有视图?

Pau*_*ine 5

1)Django的CSRF令牌在浏览会话期间是否得到更新?

看起来CSRF令牌在每个会话中都是唯一的,但根据我的观察,我没有"官方"来源.使用Angular.js我使用以下代码没有问题:

angular.module('app', ...)
  .config(function($httpProvider) {
    var cookies = document.cookie.split(';');
    var csrftoken = _.find(cookies, function(v) { 
                      return v.trim().indexOf('csrftoken=') == 0; 
                    });
    if(csrftoken) {
      $httpProvider.defaults.headers.common['X-CSRFToken'] = csrftoken.split('=')[1];
    }
  })
Run Code Online (Sandbox Code Playgroud)

因为我从Django提供HTML,所以当Angular引导时,cookie已经存在.

2)如果'是',这是否意味着我需要将ensure_csrf_cookie()装饰器应用于我拥有的所有视图?

如果CSRF,您可以尝试使用CORS.Otto Yiu维护着django-cors-headers包,已知它可以正常使用REST框架API.

一些(未经测试的)想法适用ensure_csrf_cookie():

  • 猴子补丁APIView
  • 创建CSRFCookie mixin并将其添加到您的视图中
  • 适用ensure_csrf_cookie()于您的基类