使用javascript更新CSRF表单输入输入

时间:2014-02-27 09:56:17

标签: django forms angularjs csrf django-csrf

我在页面上有多个表单,全部使用CSRF令牌模板标记{%csrf_token%}我使用Angular $ http发布表单。

所有表单都有相同的CSRF令牌,因此当我发布一个表单时,它会使其他表单无效。

有没有办法当我发布表单时,我从服务器获得一个新的CSRF令牌,我可以使用它来更新表单。

我尝试使用$ http headers()从响应标头中获取新的CSRF令牌,但它不可用。

2 个答案:

答案 0 :(得分:2)

持有CSRF令牌的浏览器cookie应在您的登录请求后更新。您应该能够从csrftoken Cookie获取新令牌,如CSRF documentation中所示:

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // 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;
}
var csrftoken = getCookie('csrftoken');

您还应该能够跳过大部分样板,只需使用the AngularJS $cookies API

var csrftoken = $cookie.csrftoken;

答案 1 :(得分:1)

有点黑客但这就是我最终做的事情:

在我的回复中,我明确设置了新的CSRF令牌值

response['new_csrf'] = self.request.META['CSRF_COOKIE']
return response

然后可以使用Angular $ headers()

在客户端上访问它
var new_csrf = headers()['new_csrf']

然后我更新$ hhtp帖子标题

$http.defaults.headers.post['X-CSRFToken'] = new_csrf;