CSRF令牌丢失,导致Django应用程序中的验证失败';s登录表单(通过转发代理访问)

CSRF令牌丢失,导致Django应用程序中的验证失败';s登录表单(通过转发代理访问),django,csrf,csrf-protection,django-csrf,Django,Csrf,Csrf Protection,Django Csrf,我维护了一个简单的Django web应用程序,用户聚集在一起,互相留下文字+照片消息。服务器使用SSL。我还使用CDN为静态资产提供服务,以防万一 我的问题是,在尝试登录现有用户时,我得到了一个CSRF验证失败错误。特别是,许多用户报告在第一次尝试登录时出现此错误,但在第二次登录后,此错误就会再次出现。此外,中间还涉及一个代理-此错误的所有报告者都在所述代理上。如果没有代理,它可以完美地工作。在Chrome开发工具中查看资源,我发现CSRF令牌在没有中间代理的情况下访问网站时是正确的,但在代理

我维护了一个简单的Django web应用程序,用户聚集在一起,互相留下文字+照片消息。服务器使用SSL。我还使用CDN为静态资产提供服务,以防万一

我的问题是,在尝试登录现有用户时,我得到了一个CSRF验证失败错误。特别是,许多用户报告在第一次尝试登录时出现此错误,但在第二次登录后,此错误就会再次出现。此外,中间还涉及一个代理-此错误的所有报告者都在所述代理上。如果没有代理,它可以完美地工作。在Chrome开发工具中查看<代码>资源,我发现CSRF令牌在没有中间代理的情况下访问网站时是正确的,但在代理上<>强>完全遗漏< /强>。 我应该对此采取什么特别措施


我使用一个普通的登录过程,即contrib函数。在my urls.py中,我有url模式:

url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'login.html'}, name="login"),
在settings.py中,我有:

MIDDLEWARE_CLASSES = (
 #   'debug_toolbar.middleware.DebugToolbarMiddleware',
    'myproject.middleware.XForwardedFor.XForwardedForMiddleware',
    'user_sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    #'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'myproject.middleware.HellBanned.HellBannedMiddleware',
    #'request.middleware.RequestMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'mobileesp.middleware.MobileDetectionMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
而django.contrib.auth中的views.py中的登录函数是:

@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
          redirect_field_name=REDIRECT_FIELD_NAME,
          authentication_form=AuthenticationForm,
          current_app=None, extra_context=None):
    """
    Displays the login form and handles the login action.
    """
    redirect_to = request.REQUEST.get(redirect_field_name, '')

    if request.method == "POST":
        form = authentication_form(data=request.POST)
        if form.is_valid():

            # Ensure the user-originating redirection url is safe.
            if not is_safe_url(url=redirect_to, host=request.get_host()):
                redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)

            # Okay, security check complete. Log the user in.
            auth_login(request, form.get_user())

            if request.session.test_cookie_worked():
                request.session.delete_test_cookie()

            return HttpResponseRedirect(redirect_to)
    else:
        form = authentication_form(request)

    request.session.set_test_cookie()

    current_site = get_current_site(request)

    context = {
        'form': form,
        redirect_field_name: redirect_to,
        'site': current_site,
        'site_name': current_site.name,
    }
    if extra_context is not None:
        context.update(extra_context)
    return TemplateResponse(request, template_name, context,
                            current_app=current_app)
上述函数是否缺少任何内容?顺便说一句,我的登录模板非常简单:

{% extends "base.html" %}
{% block content %}

<div class="margin">
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
  {% csrf_token %}
  <input type="hidden" name="next" value="{{ next }}">

    <p>{{ 'Nickname:' }}
      {{ form.username }}</p>

    <p>  {{ 'Password:' }}
      {{ form.password }}</p>


  <input class="button" type="submit" value="OK"><br>

</form>
<br>
</div>

{% endblock %}
{%extends“base.html”%}
{%block content%}
{%csrf_令牌%}
{{'昵称:'}}
{{form.username}

{{'密码:'}} {{form.password}}



{%endblock%}
理想情况下,我不想使用
csrf-emption
,因为我觉得这是一个解决办法,并不能真正解开这个纠结

谁能告诉我需要做什么?我以前也见过类似的问题,但它们不适合我,因为:

:此OP在views.py中编写了一个错误的方法,而我只是依赖于vanilla
django.contrib.auth.views.login
方法。如:如果您使用的是render()函数、通用视图、或contrib应用程序,则已经介绍了这些应用程序,因为它们都使用RequestContext

:看起来和上面的问题一样

:此OP在她的Django模板中缺少
{%csrf_token%}
,我不是


提前谢谢。我是这个领域的新手,所以如果问题的解决方法很明显,而且我无法解决,我深表歉意。顺便说一句,如果有必要,我会为这个特定的项目使用遗留的Django(v1.5.1)

它正在运行哪个代理?因为它在没有代理的情况下工作得非常好,所以我想我们需要代理配置。@KeenanLawrence:谢谢你的洞察力Keenan。它实际上是Facebook的“下一个十亿”计划internet.org(称为“免费基础知识”)的代理。我要给他们的工程师发信息。有什么具体的事情我应该让他们帮我们挖出来吗?不幸的是,我不知道该要求什么细节。你的设置中是否有
CSRF\u COOKIE\u SECURE=True
。无论如何,我已经向Facebook的团队传递了一条信息。观看此空间的更新,并感谢您的帮助!谢谢,一旦你弄明白了,请发布一个解决方案:)它是通过哪个代理运行的?因为它在没有代理的情况下工作得非常好,所以我想我们需要代理配置。@KeenanLawrence:谢谢你的洞察力Keenan。它实际上是Facebook的“下一个十亿”计划internet.org(称为“免费基础知识”)的代理。我要给他们的工程师发信息。有什么具体的事情我应该让他们帮我们挖出来吗?不幸的是,我不知道该要求什么细节。你的设置中是否有
CSRF\u COOKIE\u SECURE=True
。无论如何,我已经向Facebook的团队传递了一条信息。观看此空间的更新,并感谢您的帮助!谢谢,一旦你弄明白了,请发布一个解决方案:)