【发布时间】:2014-01-08 12:21:08
【问题描述】:
我正在为移动应用程序制作后端,并使用带有 Userena 的 Django 进行用户管理。我使用 Django REST 框架登录并注册,一切正常。我现在唯一需要做的就是实现“忘记密码”功能。我想使用 Userena 中已经实现的一个,但即使在使用 csrf_exempt 分离器之后,我也无法摆脱错误“CSRF 令牌丢失或不正确”。我在做什么?
urls.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 %}
【问题讨论】:
-
如果您查看该表单发送的请求,例如在浏览器的开发工具(“网络”选项卡...)中,CSRF 令牌是否包含在发送的数据中?从 CSRF 保护中排除视图不是一个好主意,因为它允许攻击者重置用户的密码
-
你也可以添加views.py 只是想检查csrf_exempt 装饰器。
-
@sawangupta csrf_excempt 应用在他的 url 配置中,
csrf_exempt(password_reset) -
@sk1p 当我使用浏览器时一切正常,因为包含 CSRF 令牌。当我尝试使用移动应用程序(直接 POST 请求)或使用 curl 时,它会中断,因为在这些应用程序中我不包含 CSRF 令牌。我的问题是如何禁用 django 向我询问 CSRF 令牌。我知道这样做会带来安全隐患。
标签: django django-rest-framework django-csrf csrf-protection