Django - Логин - Запрещено (токен CSRF отсутствует или неверен.): - PullRequest
0 голосов
/ 17 сентября 2018

Я получаю ошибку Forbidden (CSRF token missing or incorrect.) при попытке использовать страницу входа.

Сценарий выглядит следующим образом:

  1. У пользователя открыты две вкладки.
  2. Обе вкладки являются страницами входа.
  3. На вкладке 1,пользователь успешно вошел в систему и был перенаправлен на новую страницу, где требуется вход в систему.
  4. На вкладке 2 пользователь не обновил страницу и все еще находится на странице входа.В бэкэнде Django пользователь уже прошел аутентификацию, но шаблон интерфейса еще не заметил этого.
  5. На вкладке 2, когда я нажимаю кнопку входа в систему, я получаю Forbidden (CSRF token missing or incorrect.) error.
  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")

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

если происходит такой сценарий, когда пользователь открывает 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'
0 голосов
/ 17 сентября 2018

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

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

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

...