Django CSRF跨站点AJAX问题

时间:2017-02-13 10:37:51

标签: ajax django csrf django-csrf django-cors-headers

我在localhost:8000有一个后端服务器,在localhost:3000有一个前端服务器。后端是Django,我安装了corsheaders包,我发出G​​ET请求没有问题。当我打开我的网站时,第一个GET请求成功设置了一个CSRF令牌(我可以在开发工具中看到cookie)。

我在settings.py中有这个:

CORS_ORIGIN_WHITELIST = (
    'localhost:3000'
)

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT'
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
)

CSRF_TRUSTED_ORIGINS = (
    'localhost:3000',
)

CORS_ALLOW_CREDENTIALS = True

现在我正在尝试发出POST请求,而且我经常被服务器拒绝:

403 - Forbidden (CSRF cookie not set.): /myapp/myview/

这就是我的JS的样子:

let csrftoken = utils.getCookie('csrftoken'); // logged this on the console, the token is really here

jQuery.ajaxSetup({
  beforeSend: function(xhr, settings) {
    xhr.setRequestHeader("X-CSRFToken", csrftoken);
  }
}); // this might be wrong - I did read it is used only if it's not cross site, but I still gave it a try

jQuery.ajax({
  url: url,
  type: 'POST',
  data: {attr: value, csrfmiddlewaretoken: csrftoken}
})...

我在AJAX数据中只尝试过csrfmiddlewaretoken。我只尝试过设置请求标头。我试过了两个。仍然没有运气。我显然遗漏了一些东西;我之前从未尝试过在Django中跨站点进行POST。

有什么建议吗?

编辑:我发现问题出在其他地方。

2 个答案:

答案 0 :(得分:0)

尝试将XSRF-Token放入Ajax请求的Header中。

 $.ajax({
         url : urlToCall, // the endpoint
         type : "POST", // http method
         headers: { "X-CSRFToken": "your token here" },
         success : function(response) {
            console.log('success', response); 
                },
            error : function(xhr,errmsg,err) {
                console.log(xhr.status + ": " +  xhr.responseText); //  provide a bit more info about the error to the console
            }
    });

答案 1 :(得分:0)

我能够做到:

$.ajax({
     url : urlToCall, // the endpoint
     type : "POST", // http method
     data : {
         csrfmiddlewaretoken: "Your token",
         data...
     },

     success : function(response) {
        console.log('success', response); 
            },
        error : function(xhr,errmsg,err) {
            console.log(xhr.status + ": " +  xhr.responseText); //  provide a bit more info about the error to the console
        }
});

希望它有所帮助!