csrf_exempt无法使用django auth

 SJ曹圭贤V 发布于 2023-02-09 10:09

我正在为移动应用程序制作后端,并使用Django和Userena进行用户管理.我使用Django REST框架进行登录并注册,一切正常.我现在唯一需要做的就是实现"忘记密码"功能.我想使用已经实现的Userena,但是即使在使用csrf_exemptdectorator 之后我也无法摆脱"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 %}
{% trans "Reset Password" %} {% csrf_token %} {{ form.as_p }}
{% endblock %}

sk1p.. 7

如果在POST到密码重置视图之前执行GET请求,则会在cookie中获取CSRF令牌,然后您可以在POST请求中发送该令牌.

如果您坚持豁免视图:我认为问题在于CSRF保护应用于password_reset视图的方式.它由明确装饰csrf_protect.

有这个问题仔细一看,让我们假设original_password_reset_viewpassword_reset没有的csrf_protect.基本上,你这样做:

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只是一个来自中间件的装饰者CsrfViewMiddleware.csrf_exempt另一方面,只是简单地csrf_exempt=True论证其论点.因此,由外部代表的中间件csrf_protect可以看到csrf_exempt=True视图上的值并禁用其CSRF投影.它否定了外在 csrf_protect.所以我们有:

csrf_protect(original_password_reset_view)

视图仍受保护.基本上,没有理智的方式.(一种疯狂的方式:编写一个request.csrf_processing_done = True为特定URL 设置的中间件.不要这样做......)

1 个回答
  • 如果在POST到密码重置视图之前执行GET请求,则会在cookie中获取CSRF令牌,然后您可以在POST请求中发送该令牌.

    如果您坚持豁免视图:我认为问题在于CSRF保护应用于password_reset视图的方式.它由明确装饰csrf_protect.

    有这个问题仔细一看,让我们假设original_password_reset_viewpassword_reset没有的csrf_protect.基本上,你这样做:

    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只是一个来自中间件的装饰者CsrfViewMiddleware.csrf_exempt另一方面,只是简单地csrf_exempt=True论证其论点.因此,由外部代表的中间件csrf_protect可以看到csrf_exempt=True视图上的值并禁用其CSRF投影.它否定了外在 csrf_protect.所以我们有:

    csrf_protect(original_password_reset_view)
    

    视图仍受保护.基本上,没有理智的方式.(一种疯狂的方式:编写一个request.csrf_processing_done = True为特定URL 设置的中间件.不要这样做......)

    2023-02-09 10:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有