Django - 登录 - 禁止(CSRF令牌丢失或不正确。):

问题描述 投票:0回答:2

当我尝试使用登录页面时,我收到Forbidden (CSRF token missing or incorrect.)错误。

方案如下:

  1. 用户打开了两个选项卡。
  2. 两个选项卡都是登录页面。
  3. 在选项卡1中,用户成功登录,并被重定向到需要登录的新页面。
  4. 在选项卡2中,用户尚未刷新页面,并且仍在登录页面中。在Django后端,用户已经过身份验证,但前端模板还没有注意到它。
  5. 在选项卡2中,当我单击登录按钮时,我得到Forbidden (CSRF token missing or incorrect.)错误。
  6. 我确保csrf_token的形式。
  7. 仅当我使用两个选项卡时才会出现此错误。
  8. 我正在使用AJAX

为什么会这样?我该如何解决?

我不知道这会有所帮助,但这是我的views.py登录

class Login_View(LoginView):

    template_name = 'login.html'

    def post(self, request, *args, **kwargs):
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)

        response_data = {}
        if user is not None:
            if user.is_active:
                login(request, user)
                response_data['result'] = 'success'
            else:
                return HttpResponse("Inactive user.")
        else:
            response_data['result'] = 'fail'

        return HttpResponse(json.dumps(response_data), content_type="application/json")
ajax django csrf csrf-protection django-csrf
2个回答
1
投票

原因在文档here中解决:

出于安全原因,每次用户登录时都会轮换CSRF令牌。在登录前生成表单的任何页面都将具有旧的无效CSRF令牌,需要重新加载。如果用户在登录后使用后退按钮或者他们登录其他浏览器选项卡,则可能会发生这种情况。

至于修复它,既没有直接的方式,也没有很好的理由。如果用户在这种不太可能的情况下遇到错误,他们所要做的就是重新加载页面。如果我是你,我不会打扰。


1
投票

如果出现这样的场景,用户打开2个标签并尝试登录,这不是现实生活场景,仍然如果你想要你可以这样做,请记住用户喜欢这样玩

def post(self, request, *args, **kwargs):
        username = request.POST['username']
        password = request.POST['password']
        if request.user.is_authenticated():
            return redirect('to_some_page')
        else:
            user = authenticate(username=username, password=password)

            response_data = {}
            if user is not None:
                if user.is_active:
                    login(request, user)
                    response_data['result'] = 'success'
                else:
                    return HttpResponse("Inactive user.")
            else:
                response_data['result'] = 'fail'
© www.soinside.com 2019 - 2024. All rights reserved.