Django - 在Ajax登录后,CSRF令牌似乎无效

时间:2014-04-16 09:58:41

标签: ajax django authentication csrf

  • 我有一个可以查看身份验证的页面。
  • 此页面包含表单(及其CSRF令牌)
  • 表单需要考虑身份验证
  • 我通过ajax(在表单提交上)管理身份验证检查
  • 如果用户未经过身份验证,则可以通过新窗口(带链接)进行身份验证
  • 经过身份验证后,用户可以关闭新窗口并重新提交表单

在这种情况下,Django告诉我我的CRSF令牌不再有效

  

CSRF令牌丢失或不正确

我想这是因为session_id已经改变或类似的东西。

我的断言是否正确?
如何让用户重新提交表单而不必重新加载页面?

1 个答案:

答案 0 :(得分:3)

虽然上述方法可用于AJAX POST请求,但它有一些不便之处:您必须记住每次POST请求都将CSRF令牌作为POST数据传递。因此,有一种替代方法:在每个XMLHttpRequest上,将自定义X-CSRFToken标头设置为CSRF标记的值。这通常更容易,因为许多javascript框架提供了允许在每个请求上设置标头的钩子。

您需要通过AJAX调用发送CSRF令牌:

$.ajaxSetup({ 
     beforeSend: function(xhr, settings) {
         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;
         }
         if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
             // Only send the token to relative URLs i.e. locally.
             xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
         }
     } 
});

以下是参考链接https://docs.djangoproject.com/en/1.6/ref/contrib/csrf/#ajax