javascript 在JSON请求中发送csrf_token(无验证)

fdbelqdn  于 2024-01-05  发布在  Java
关注(0)|答案(2)|浏览(89)

我尝试使用csrf token向Django应用程序发送JSON请求,但我不知道如何操作。我已经将token放入了一个可以引用的变量中,但我不知道如何使用fetch通过JSON请求发送它。我已经将'csrfmiddlewaretoken': csrftoken添加到JSON.stringify部分,但我仍然收到错误消息403 Forbidden。有人可以帮助我吗?谢谢你,谢谢(抱歉代码上的奇怪缩进)
JavaScript文件:

fetch('/update', {
          method: 'PUT',
          body: JSON.stringify({
            'csrfmiddlewaretoken': csrftoken,
            'liked': true,
            'post_id': parseInt(button.dataset.post_id)
          })
        })

字符串
views.py:

data = json.loads(request.body)
        try:
            content = data.get('content')
        except:
            JsonResponse({'error': 'content required'}, status=400)
        try:
            id = data.get('id')
            post = Post.objects.get(id=id)
        except:
            JsonResponse({'error': 'post not found'}, status=400)
        if request.user == post.user:
            post.content = content
            post.save()
            return JsonResponse({'message': f'received: {content}'})
        return JsonResponse({'error': "can't edit this user's posts"}, status=403)

hsgswve4

hsgswve41#

首先要获取csrf你可以使用下面的代码

function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
    const cookies = document.cookie.split(';');
    for (let i = 0; i < cookies.length; i++) {
        const cookie = cookies[i].trim();
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) === (name + '=')) {
            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
            break;
        }
    }
}
return cookieValue;

字符串
}
现在我们得到了CSRF令牌,将这行代码添加到fetch的头部中

'X-CSRFToken':csrftoken,


Refrence

insrf1ej

insrf1ej2#

首先,来自Andrea和Gabcvit的一些代码将非常受欢迎。
编辑Farhan的回答:您需要手动检索csrf token,因为JavaScript中没有默认的方法。您可以通过以下方式执行此操作:

import jQuery from 'jquery';  // important dependency

function getCookie(name) {
  let cookieValue = null;
  if (document.cookie && document.cookie !== '') {
    let cookies = document.cookie.split(';');
    for (let i = 0; i < cookies.length; i++) {
      let cookie = jQuery.trim(cookies[i]);
      if (cookie.substring(0, name.length + 1) === (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
      }
    }
  }
  return cookieValue;
}

var csrftoken = getCookie('csrftoken');

字符串
如果React没有收到Django的csrf token(在我的例子中发生了),你需要在视图上方添加以下代码:

@method_decorator(ensure_csrf_cookie, name='dispatch')
class UserLoginView(View):
    # ...


如果您需要更多帮助,this MDN article将帮助您。

相关问题