【发布时间】: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