【问题标题】:Using Django REST Framework with sessions-based CSRF将 Django REST Framework 与基于会话的 CSRF 结合使用
【发布时间】:2019-02-26 21:57:27
【问题描述】:

我在无法使用基于 cookie 的 CSRF 令牌的环境中使用 Django + Django REST Framework;因此我必须使用CSRF_USE_SESSIONS = True

但是,DRF 网络用户界面依赖于此 cookie 进行所有交互。看来这是通过读取csrftoken cookie 并在后续请求中设置X-CSRFToken 标头来设置的,如果隐藏字段未包含在请求正文中,则django.middleware.csrf.CsrfViewMiddleware.process_view() 会使用该标头。这是在rest_framework.templates.rest_framework.base.html的代码中设置的:

<script>
  window.drf = {
    csrfHeaderName: "{{ csrf_header_name|default:'X-CSRFToken' }}",
    csrfCookieName: "{{ csrf_cookie_name|default:'csrftoken' }}"
  };
</script>

不使用POST的DRF表单确实在表单主体中包含CSRF令牌,因此没有cookie意味着Web界面根本无法访问CSRF令牌,导致所有PUT,@987654329 @ 和 DELETE 请求失败并返回 403 响应。

相信这是 DRF 中的一个错误,但可能这是预期的行为。有人能解释一下 DRF 是如何与CSRF_USE_SESSIONS = True 一起使用的吗?

【问题讨论】:

    标签: django django-rest-framework csrf


    【解决方案1】:

    这已在 https://github.com/encode/django-rest-framework/pull/6207 中修复,并作为 DRF 3.9.2 的一部分发布。更完整的上下文可以在https://github.com/encode/django-rest-framework/issues/6206阅读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2013-05-06
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多