Я получаю сообщение об ошибке 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")
0
Eric Kim 17 Сен 2018 в 08:47

2 ответа

Лучший ответ

Причина указана в документации здесь:

По соображениям безопасности токены CSRF меняются каждый раз, когда пользователь входит в систему. Любая страница с формой, созданной до входа в систему, будет иметь старый, недопустимый токен CSRF, и ее необходимо будет перезагрузить. Это может произойти, если пользователь использует кнопку «Назад» после входа в систему или входит в другую вкладку браузера.

Что касается его исправления, то нет ни простого способа, ни веской причины для этого. Если пользователь обнаруживает ошибку в этом маловероятном сценарии, все, что ему нужно сделать, - это перезагрузить страницу. Так что на твоем месте я бы не стал беспокоиться.

1
Kevin Christopher Henry 17 Сен 2018 в 05:59

Если происходит такой сценарий, когда пользователь открывает 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'
1
Exprator 17 Сен 2018 в 06:19