【问题标题】:Are there any other reason which can cause 403 error except absence of csrf token in ajax request + django?除了 ajax 请求 + django 中没有 csrf 令牌之外,还有其他可能导致 403 错误的原因吗?
【发布时间】:2017-09-11 02:28:06
【问题描述】:

django + ajax 403 错误的主要原因是缺少 csrf 令牌,但在我的情况下它存在并且几乎相同的 ajax 函数可以正常工作。我还将附加使用 djangorestframework 处理响应的后端视图函数。

  $.ajax({
    url: '/authsteptwo/',
    type:'POST',
    dataType: 'json',
    data: { phone_number : phone_number, email : email, csrfmiddlewaretoken: "{{ csrf_token }}" },
    success: function () {

      // alert('succes');
      setTimeout(
  function() 
  {
      alert('fine');
  }, 0);

    },
    error : function() {


        alert('fck');
    }


  })

查看

@api_view(['POST', ])
def auth_step_two(request):
    if request.method == 'POST':
        phone_number = request.data['phone_number']
        email = request.data['email']
        # user = request.user.UserProfile
        # user.email = email
        # user.phone_number = phone_number
        # user.save()
    else:
        print("WTF")
    return Response(request.data)

控制台:

Failed to load resource: the server responded with a status of 403 (FORBIDDEN)

还有其他原因会导致 403 错误吗?

编辑:我试图在页面的开始时调用 ajax 函数,然后它就起作用了。但是在点击时调用相同的函数(没有真实数据,所以它不相关)失败了 403 或者也落在了 jQuery 点击事件上。很奇怪。有什么建议吗?

编辑:哦,我发现在执行第一次 ajax 身份验证调用后实际上没有 ajax 函数起作用。我附上了第一次调用的代码,它有效,之后没有任何效果。帮助我理解为什么?

 $.ajax({
    url: '/authfb/',
    type:'POST',
    dataType: 'json',
    data: {"fb_first_name": fb_first_name, "fb_last_name": fb_last_name, "fb_username": fb_username, "fb_email":fb_email, "fb_id":fb_id, "fb_link":fb_link, csrfmiddlewaretoken: "{{ csrf_token }}" },
    success: function () {

      // alert('succes');
      setTimeout(
  function() 
  {
    $('#hide_group').hide();
    $('#show_group').show();
    $('.loading_white_wall').fadeOut();
    $('.greeting_title_name').html(fb_first_name);
    if(fb_email){

      $(".email_input").prop("value", fb_email);
    }

    else{

        $(".email_input").prop("placeholder", 'E-mail');
    }


  }, 1000);

    },
    error : function(data) {

      $('#hide_group').hide();
      $('#error_group').show();
      $('.loading_white_wall').fadeOut();

    }


  })

还有处理程序的确切代码,有很多但可能有某种相关的东西,但很可能没有太多用处:

@api_view(['POST', ])
def authfb(request):
    require_more_data = True
    if request.method == 'POST':
        first_name = request.data['fb_first_name']
        last_name = request.data['fb_last_name']
        fb_username = request.data['fb_username']
        fb_id = int(request.data['fb_id'])
        fb_link = request.data['fb_link']
        username = fb_username.replace(' ', '')
        print(fb_link)
        print (type(fb_id))

        # print(username)
        password = '11442358'
        user = auth.authenticate(username=username, password=password)
        # print(type(username))
        # print(type(password))
        if user is not None:
            auth.login(request, user)
            username = auth.get_user(request).username
            print ('logged in succesfully')
            # user1 = UserProfile.user.objects.get(username=username)
            # if (user1.userprofile.phone_number):
            #     print ("hello")
            # email = auth.get_user(request).UserProfile.email
            # if phone_number and email:
            #     require_more_data = False
        else:
            user = User.objects.create_user(username=username, password=password)
            userprofile = UserProfile.objects.create(user=user, first_name=first_name, last_name=last_name)
            user = auth.authenticate(username=username, password=password)
            auth.login(request, user)
            print (userprofile)
    else:
        print("WTF")
    return Response(request.data)

【问题讨论】:

  • 可能是身份验证令牌。也许您的 API 资源正在强制进行身份验证,而您遗漏了一些东西。
  • @AamirAdnan 我测试过什么都不发送,只发送令牌,但仍然存在错误。
  • 我不是在谈论csrfmiddlewaretoken 我在谈论django-rest-framework 以及它是如何handles the authentication
  • @AamirAdnan 我明白了。不强制任何东西,不使用序列化程序或要求。就是这样,只是 ajax 调用、urls.py 行(正确)和处理所有这些东西的视图函数。奇怪的是它在同一个函数中工作,检查没有区别。
  • @AamirAdnan 唯一的问题是这个函数是 ajax 在用户通过身份验证后调用(使用 ajax request/fb),但之后所有其他 ajax 函数都可以工作

标签: javascript jquery ajax django django-rest-framework


【解决方案1】:

我在一个旧项目中找到了解决方案。如果有人解释了为什么这有效而之前的错误,我将标记为正确。

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length == 2) return parts.pop().split(";").shift();
}
var csrftoken = getCookie('csrftoken');
 $.ajaxSetup({
        headers: { "X-CSRFToken": getCookie("csrftoken") }
    });

在ajax调用中

    data: {"fb_first_name": fb_first_name,'csrfmiddlewaretoken': getCookie('csrftoken') },

【讨论】:

    猜你喜欢
    • 2016-05-08
    • 2011-03-24
    • 1970-01-01
    • 2021-12-28
    • 2018-01-08
    • 1970-01-01
    • 2014-02-22
    • 2021-04-01
    • 2016-06-22
    相关资源
    最近更新 更多