将 Django REST Framework 与 sessions-based CSRF 一起使用
Using Django REST Framework with sessions-based CSRF
我在无法使用 cookie-based CSRF 令牌的环境中使用 Django + Django REST Framework;因此我必须 运行 和 CSRF_USE_SESSIONS = True
.
然而,DRF 网络 UI 依赖此 cookie 进行所有交互。看起来这是通过读取 csrftoken
cookie 并在后续请求中设置 X-CSRFToken
header 来设置的,如果隐藏字段不包含在中,则由 django.middleware.csrf.CsrfViewMiddleware.process_view()
使用请求 body。这是在 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 表单确实包含表单 body 中的 CSRF 令牌,因此没有 cookie 意味着 Web 界面根本无法访问 CSRF 令牌,导致所有 PUT
、PATCH
和 DELETE
请求失败并返回 403 响应。
我相信这是 DRF 中的错误,但这可能是预期的行为。有人可以解释一下 DRF 是如何与 CSRF_USE_SESSIONS = True
一起使用的吗?
这已在 https://github.com/encode/django-rest-framework/pull/6207 and released as part of DRF 3.9.2. More complete context can be read at https://github.com/encode/django-rest-framework/issues/6206 中修复。
我在无法使用 cookie-based CSRF 令牌的环境中使用 Django + Django REST Framework;因此我必须 运行 和 CSRF_USE_SESSIONS = True
.
然而,DRF 网络 UI 依赖此 cookie 进行所有交互。看起来这是通过读取 csrftoken
cookie 并在后续请求中设置 X-CSRFToken
header 来设置的,如果隐藏字段不包含在中,则由 django.middleware.csrf.CsrfViewMiddleware.process_view()
使用请求 body。这是在 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 表单确实包含表单 body 中的 CSRF 令牌,因此没有 cookie 意味着 Web 界面根本无法访问 CSRF 令牌,导致所有 PUT
、PATCH
和 DELETE
请求失败并返回 403 响应。
我相信这是 DRF 中的错误,但这可能是预期的行为。有人可以解释一下 DRF 是如何与 CSRF_USE_SESSIONS = True
一起使用的吗?
这已在 https://github.com/encode/django-rest-framework/pull/6207 and released as part of DRF 3.9.2. More complete context can be read at https://github.com/encode/django-rest-framework/issues/6206 中修复。