我在页面上有多个表单,全部使用CSRF令牌模板标记{%csrf_token%}我使用Angular $ http发布表单。
所有表单都有相同的CSRF令牌,因此当我发布一个表单时,它会使其他表单无效。
有没有办法当我发布表单时,我从服务器获得一个新的CSRF令牌,我可以使用它来更新表单。
我尝试使用$ http headers()从响应标头中获取新的CSRF令牌,但它不可用。
答案 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;