【问题标题】:CSRF verification failed when in chrome incognito在 chrome 隐身模式下,CSRF 验证失败
【发布时间】:2018-01-26 22:36:59
【问题描述】:

我最近将我的应用程序从 Django 1.11 升级到了 Django 2.0。

我在 Google Chrome 的隐身模式下尝试登录时遇到了一个问题,这是我第一次收到:Forbidden (403) CSRF verification failed. Request aborted.。如果我重新发送登录帖子,我仍然会收到错误消息。但是,如果我再次进入登录页面,它可以正常工作。

我认为这与 cookie 有关。我的中间件如下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
]

我的登录视图:

from django.contrib.auth.views import LoginView as AuthLoginView

class LoginView(AuthLoginView):
    template_name = 'transactions/login.html'

模板transactions/login.html:

{% extends 'base.html' %}

{% load bootstrap_tags %}

{% block content %}

    <div class="col-sm-6 col-md-4 well">

        <form action="{% url 'login' %}" method="post" class="form">
            {% csrf_token %}
            {{ form|as_bootstrap }}
            <button type="submit" class="btn btn-primary">Login</button>
        </form>

    </div>

{% endblock content %}

我假设一切配置正确,因为这个问题只发生在这种情况下。

有人知道怎么回事吗?

【问题讨论】:

  • 你能分享你的登录代码吗?
  • 完成@LaurynasTamulevičius
  • 您不能重新发送带有 CSRF 令牌的表单,它只能使用一次。
  • 它发生在第一个表单的帖子上,@melwil
  • 您是否使用任何类型的 javascript 与此表单的提交进行交互?

标签: python django python-3.x django-2.0


【解决方案1】:

当您从常规窗口登录时,您会获得当前用户的 csrf_token,但当您切换到隐身模式时,您将成为 匿名用户。因此,您的旧 csrf_token 不匹配,并引发 403 禁止错误。因此,它需要您注销并重新登录。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2018-04-13
    • 2014-01-09
    • 1970-01-01
    • 2012-09-08
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多