[csrf登录时验证失败

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

我在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请求。请求后,我再次刷新它。我确定每次用户登录或注销时,每次刷新时,csrf令牌的值都会更改,但是服务器始终显示“禁止”。

我已将此代码插入我的settings.py文件:

CSRF_HEADER_NAME = "HTTP_XCSRF_TOKEN"

并且我正在发送带有名为XCSRF_TOKEN的标头的ajax请求

有人可以帮助我吗?

对我的英语感到抱歉

javascript django ajax csrf
1个回答
0
投票

也许尝试:

headers: {
        "HTTP_XCSRF_TOKEN": csrf
      },

以使其与您的设置文件中的标题名称匹配。


0
投票

我认为添加如下所示的标题会起作用。并且我知道您应该将令牌放在标头中。

headers: {
    'Authorization':'Basic 55555555555555',
    'X-CSRF-TOKEN':'333333333333333',
    'Content-Type':'application/json'
},
© www.soinside.com 2019 - 2024. All rights reserved.