Ошибка проверки csrf при входе в систему - PullRequest
0 голосов
/ 26 января 2020

В моем django бэкэнде есть представление с именем getUserInfo, которое будет возвращать информацию пользователя в формате json.

Это мой взгляд:

@api_view(["POST"])
def getUserInfo(request):
    if request.user.username:
        serial = userInfoSerializer(request.user)
        return Response(serial.data)
    else:
        return Response({"notLoggedIn": True})

Когда я не вошел в систему ajax запрос работает нормально, но когда я захожу в учетную запись пользователя, я получаю "запрещенную" ошибку и он говорит, что проверка csrf не удалась. Я также обновляю токен csrf каждый раз, когда пользователь входит или выходит из системы.

Так что он должен работать, но он не работает.

Это мой ajax запрос:

function login(){
    getcsrf();
    $.ajax({
      url: '/api/login/',
      type: 'POST',
      headers: {
        "XCSRF_TOKEN": csrf
      },
      data: {
        username: $("#l-username").val(),
        password: $("#l-password").val(),
      },
    })
    .done(function(data) {
      console.log(data)
      if(data.msg){
        console.log(data.msg)
        $(`<div class="p-2 bg-danger">`+data.msg+`</div>`).prependTo('#message-box')
      }else{
        getcsrf();
        getUserInfo();
      }
      console.log("success");
    })
    .fail(function() {
      console.log("error");
    })
    .always(function() {
      console.log("complete");
    });
}

Функция getcsrf обновляет глобальную переменную, содержащую значение токена csrf под названием "csrf", и затем я отправляю свой запрос ajax. После запроса я повторяю sh снова. Я уверен, что значение токена csrf меняется каждый раз, когда я обновляю его, когда пользователь входит в систему или выходит, но сервер всегда говорит «запрещено».

Я вставил этот код в мой файл settings.py:

CSRF_HEADER_NAME = "HTTP_XCSRF_TOKEN"

и я отправляю ajax запрос с заголовком XCSRF_TOKEN

Может ли кто-нибудь мне помочь?

Извините за мой английский SH

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

хорошо, позвольте мне ответить самому себе.
Я очистил куки браузера и затем он заработал нормально

0 голосов
/ 26 января 2020

Возможно, попробуйте:

headers: {
        "HTTP_XCSRF_TOKEN": csrf
      },

, чтобы оно совпадало с именем заголовка в вашем файле настроек.

...