CSRF令牌丢失,导致Django应用程序中的验证失败';s登录表单(通过转发代理访问)
我维护了一个简单的Django web应用程序,用户聚集在一起,互相留下文字+照片消息。服务器使用SSL。我还使用CDN为静态资产提供服务,以防万一 我的问题是,在尝试登录现有用户时,我得到了一个CSRF验证失败错误。特别是,许多用户报告在第一次尝试登录时出现此错误,但在第二次登录后,此错误就会再次出现。此外,中间还涉及一个代理-此错误的所有报告者都在所述代理上。如果没有代理,它可以完美地工作。在Chrome开发工具中查看<代码>资源,我发现CSRF令牌在没有中间代理的情况下访问网站时是正确的,但在代理上<>强>完全遗漏< /强>。 我应该对此采取什么特别措施CSRF令牌丢失,导致Django应用程序中的验证失败';s登录表单(通过转发代理访问),django,csrf,csrf-protection,django-csrf,Django,Csrf,Csrf Protection,Django 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中编写了一个错误的方法,而我只是依赖于vanilladjango.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的团队传递了一条信息。观看此空间的更新,并感谢您的帮助!谢谢,一旦你弄明白了,请发布一个解决方案:)