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

 开心果娟娟 发布于 2023-02-13 09:42

我目前的设置是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()装饰器应用于我拥有的所有视图?

1 个回答
  • 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];
        }
      })
    

    因为我从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()于您的基类

    2023-02-13 09:48 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有