2012-08-14 65 views
2

我对这里的许多作品(Django/Ajax等)都陌生,所以虽然我理解高级CSFR图片,但我没有完整的细节处理。Django中间件用HTTPS POST使用ajax抛出403错误

由于传递的数据量较大,我需要将GET请求转换为PUT。高级别,我正在通过HTTPS对django应用程序进行AJAX POST API调用。该呼叫是从页面所在的同一个域进行的。

但是,我不断收到'CSRF cookie未设置'的错误。

我使用Django 1.4

为了突破CSRF保护,我已经包含了X-CSFRToken视为页眉其他职位提到这里包括{{csrf_token}}在发布数据标签。但是,它看起来不像标签被替换为标记。 X-CSFRToken值在请求中作为NULL发送。不知道为什么它没有设置。

我的印象是,我不需要在页面视图中使用ensure_csrf_cookie(),因为我在ajaxSetup中的POST之前获取了cookie,但我也尝试了这一点。

想法我做错了什么?

相关代码:

siteUrl = "https://localhost:8443/" 

$.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]); 
       if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
       } 
      } 
     } 
     return cookieValue; 
     } 
     if (new RegExp("^"+siteUrl.replace("\\","\\\\")+".*").test(settings.url)) { 
      // Only send the token to URLs from our site. 
      xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
     } 
    } 
}); 


$.ajax({ 
    url: submitUrl, 
    data: {'network_ids': JSON.stringify(network_ids), 
      'csrfmiddlewaretoken': '{{ csrf_token }}'}, 
    type: 'POST', 
    crossDomain: true, 
    dataType: 'json', 
    cotentType: 'application/json', 
    success: function(mydata) { 
     console.log(mydata); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) {alert(textStatus); alert(errorThrown)} 
}) 

回答

1

您有几种选择: 该代码清单显示你从cookie获取CSRF令牌:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

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; 
} 
getCookie('csrftoken'); 

和假设的JavaScript函数提交到Django视图,你可以告诉视图忽略csrf保护。 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#django.views.decorators.csrf.csrf_exempt

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    return HttpResponse('Hello world') 
0

是您的JS通过Django的模板引擎服务?否则{{ csrf_token }}将不会被评估。你有没有检查过它是否被发送到服务器?

而且根据docsajaxSend事件背后的想法是,你必须通过csrf_token明确。

我注意到您的ajaxSetup与文档中的略有不同。这可能是正确的,但我会从文档复制原件。