2014-02-27 42 views
1

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

所有表单都具有相同的CSRF标记,因此当我发布一个表单时会使其他表单失效。

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

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

+2

的CSRF中间件不使用时无效令牌访问。 CSRF令牌仅在新登录时更改;只要同一用户登录,它就保持不变。您的问题不是由CSRF令牌失效引起的,除非您发布的表单实际执行登录。 – lanzz

+1

更详细的一点,我在同一页上有一个注册表和登录表单,两个表示都有一个标记CZQOkC6LUEOixqFYzDiZYlTyY89KoFII。我可以注册为一个用户罚款,但是如果我尝试在同一页面上登录(不刷新),我得到一个403禁止的“CSRF令牌丢失或不正确”? – sidarcy

回答

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; 
+0

+1角饼干建议,但是,虽然csrftoken在请求中,我没有看到它在$饼干(我看到所有其他饼干)任何建议 – sidarcy

+0

你可以检查,如果你看到'csrftoken'在原始的'document.cookie'字符串? Angular可能会提供过时的数据,但浏览器cookie存储应该已随您的AJAX响应收到的新CSRF令牌更新。 – lanzz

+0

csrf也是从document.cookie中丢失的,我应该提到这个:(关于如何获得新的csrf标记(从AJAX响应中接收到的)的任何想法我尝试了$ header但没有运气 – sidarcy

1

一个黑客的有点,但是这是我落得这样做:

在我的回应,我明确地设置新的CSRF令牌值

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

然后可以在客户端上采用了棱角分明$头()

var new_csrf = headers()['new_csrf'] 

然后我更新$ HHTP后头部

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