2012-08-14 4 views
2

저는 여기 (Django/Ajax 등)에서 많은 부분을 다룹니다. 따라서 고급 CSFR 그림을 이해하는 동안 세부 사항을 완벽하게 이해하지 못합니다.Django 미들웨어는 ajax를 사용하여 HTTPS POST에서 403 오류를 발생합니다.

더 많은 양의 데이터가 전달되기 때문에 GET에서 PUT으로 요청을 변환해야했습니다. 높은 수준, 나는 HTTPS를 통해 장고 응용 프로그램에 AJAX POST API 호출을 만들고 있습니다. 호출은 페이지가 제공되는 도메인과 동일하게 만들어집니다.

그러나 'CSRF 쿠키가 설정되지 않았습니다'오류가 계속 발생합니다. 헤더에 여기에 다른 게시물에 언급 된 게시 된 데이터에 {{csrf_token}} 태그를 포함 나는이 CSRF 보호를지나 얻으려면

장고 1.4을 사용하고

, 나는 X-CSFRToken을 포함했다. 그러나 태그가 토큰으로 대체되는 것처럼 보이지 않습니다. 요청시 X-CSFRToken 값이 NULL로 전송됩니다. 왜 그것이 나던가 설정 모르겠어요.

나는 ajaxSetup의 POST 전에 쿠키를 얻을 때 페이지 뷰에서 ensure_csrf_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

당신은 몇 가지 선택 사항이 있습니다 이 코드 목록은 쿠키에서 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'); 

및 자바 스크립트 함수는 장고보기로 제출되는 것을 가정하면, 해당 뷰를 알 수 있습니다 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 장고의 템플릿 엔진을 통해 제공됩니다? 그렇지 않으면 {{ csrf_token }}은 평가되지 않습니다. 실제로 서버에 게시되었는지 확인 했습니까? 또한 ajaxSend 이벤트 뒤에 아이디어는 당신이하지을 있다는 것입니다 docs에 따라

명시 적으로 csrf_token을 통과해야합니다.

ajaxSetup이 문서의 내용과 약간 다른 것으로 나타났습니다. 그것은 맞을 수도 있지만, 나는 원래의 문서에서 복사합니다.