gpt4 book ai didi

django - csrf_exempt 不适用于 django auth

转载 作者:行者123 更新时间:2023-12-01 09:58:29 26 4
gpt4 key购买 nike

我正在为移动应用程序制作后端,并使用 Django 和 Userena 进行用户管理。我使用 Django REST 框架进行了登录和注册,一切正常。我现在唯一需要做的就是实现“忘记密码”功能。我想使用 Userena 中已经实现的一个,但即使在使用 csrf_exempt dectorator 之后,我也无法摆脱错误“CSRF token 丢失或不正确”。我在做什么?

网址.py

from django.contrib.auth.views import password_reset
from django.views.decorators.csrf import csrf_exempt
...
urlpatterns = patterns(
'',
url(r'^password/mobile/reset/$',
csrf_exempt(password_reset),
{'template_name': 'userena/password_reset_form.html',
'email_template_name': 'userena/emails/password_reset_message.txt',
'extra_context': {'without_usernames': userena_settings.USERENA_WITHOUT_USERNAMES}
},
name='userena_password_mobile_reset'),
)

passowrd_reset_form.html

{% extends 'userena/base_userena.html' %}
{% load i18n %}

{% block title %}{% trans "Reset password" %}{% endblock %}

{% block content %}
<form action="" method="post">
<fieldset>
<legend>{% trans "Reset Password" %}</legend>
{% csrf_token %}
{{ form.as_p }}
</fieldset>
<input type="submit" value="{% trans "Send password" %}" />
</form>
{% endblock %}

最佳答案

如果您在 POST 到密码重置 View 之前执行 GET 请求,您会在 cookie 中获得 CSRF token ,然后您可以在 POST 请求中发送该 token 。

如果您坚持豁免 View :我认为问题在于将 CSRF 保护应用于 password_reset View 的方式。它由 csrf_protect 显式装饰。

为了更深入地了解问题,我们假设 original_password_reset_view 是没有 csrf_protectpassword_reset。基本上,您正在这样做:

csrf_exempt(csrf_protect(original_password_reset_view))
# ^^ your code
# ^^ the decorator in django.contrib.auth.views

并添加 CsrfViewMiddleware 的效果,我们得到等同于

csrf_protect(csrf_exempt(csrf_protect(original_password_reset_view)))

csrf_protect 只是一个 middleware-turned-decorator来自 CsrfViewMiddlewarecsrf_exempt 另一方面 simply sets csrf_exempt=True关于它的论点。因此,由外部 csrf_protect 表示的中间件会在 View 上看到 csrf_exempt=True 值并禁用其 CSRF 投影。它否定了outer csrf_protect。所以我们有:

csrf_protect(original_password_reset_view)

View 仍然受到保护。基本上,没有明智的方法。 (一种疯狂的方式:编写一个中间件,为该特定 URL 设置 request.csrf_processing_done = True。不要那样做...)

关于django - csrf_exempt 不适用于 django auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20690051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com