ProgramingTip

Django csrf 토큰 + Angularjs

bestdevel 2020. 11. 19. 21:52
반응형

Django csrf 토큰 + Angularjs


mod_wsgi를 사용하여 아파치 서버에서 django를 실행하고 django가 아닌 아파치에서 직접 제공하는 angularjs 앱이 있습니다. django 서버 (rest_framework 실행)에 POST 호출을하고 싶지만 csrf 토큰에 문제가 있습니다.

{% csrf token %}템플릿의 일부로 넣지 않고 서버에서 서버를 설정하는 방법이 토큰 이 페이지가 통과하지 않기 때문에?

  1. GET 요청을 통해 csrf 토큰을 쿠키로 받고 싶습니다.
  2. 그런 다음 csrf 토큰 쿠키 값으로 django 서버에 POST 요청을 할 수 있습니다.

Django와 AngularJS는 이미 CSRF를 지원하고 있습니다.

Django에서 CSRF를 먼저 활성화해야합니다. Django 문서 https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax를 준수하십시오 .

이제 장고는 csrftoken첫-th GET에 요청 이름이 지정된 쿠키를 설정하고 X-CSRFToken이후 POST / PUT / 요청 DELETE 에서 사용자 지정 HTTP 헤더 예상 합니다.

Angular의 경우 이름이 지정된 쿠키를 예상하고 헤더를 사용하여 XSRF-TOKENPOST / PUT / DELETE 요청 X-XSRF-TOKEN을 수행 할 때 두 가지가 서로 연결 약간 조정해야합니다.

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';

js 코드 어딘가에 두 줄 위에 추가하면 module.config () 블록이 좋은 위치입니다.

그게 다야.

참고 : 이것은 각도 1.1.5 용이며 이전 버전은 다른 접근 방식이 필요할 수 있습니다.

최신 정보 :

angular 앱은 django에서 제공하지 않고 쿠키를 설정 먼저 먼저 angular 앱에서 django에 GET 요청을해야합니다.


var foo = angular.module('foo', ['bar']);

foo.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);

그리고 $ http가 사용 된 모든 모듈 서비스와 컨트롤러는 csrf 토큰으로 요청을 보냅니다.


주변을 검색 한 후 다음 코드 를 사용 하여 저에게 맞는 게시물 .

angular.module( '[your module name]',
    ... [some dependencies] ...
    'ngCookies',
    ... [other dependencies] ...
)
.run( function run( $http, $cookies ){

    // For CSRF token compatibility with Django
    $http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken');
})

이것은 물론 django 서버에서 GET 요청을 통해 쿠키를 얻은 후입니다.

나는 또한 너희 Liun의를 포함하여, 여기에 다른 답변의 일부에 보였지만 이외의 $ httpProvider에 XSRF에 대한 조치하지 옵션을 지정하지 않고이 풀 요청 공식 문서에서 아무것도 없음 이 풀 요청 을 작성 하는 시간.


내 (REST) ​​API Django 앱과 동일한 Django 프로젝트에서 내 AngularJS 앱용 Django 앱을 만들었습니다.이 프로젝트는 index.html 파일 (단지 sym.link) 만 제공합니다. 대신 방식으로 CSRF 쿠키는 추가 GET 요청없이 설정됩니다.

CORS 및 CSRF 보호를 사용하여 하위 도메인 B의 Django JSON (REST) ​​API와 대화하는 하위 도메인 A의 AngularJS 단일 페이지 웹 응용 프로그램에 대한 내 대답을 참조하십시오.


자바 펼쳐 액세스를 허용하지 않도록 쿠키를 설정 한 경우 다음을 수행합니다. 템플릿에서 django 앱을 만들기 전에 다음을 추가합니다.

<script>
    window.csrf_token = "{{ csrf_token }}";
</script>

각도 앱에서 다음을 추가하십시오.

angularApp.config(["$httpProvider", function($httpProvider) {
    $httpProvider.defaults.headers.common["X-CSRFToken"] = window.csrf_token;
}]);

Django 1.9를 통해 CSRF 토큰은 각 요청에 따라 변경되지 않습니다. 사용자가 로그인 할 때만 변경됩니다. 단일 페이지 각도 앱을 사용하는 경우 로그인 / 로그 아웃시 토큰을 안전하게 작동합니다.

참고 : 각 요청에서 CSRF 토큰이 변경되기 때문에 Django 1.10 이상에서는 현재 작동하지 않습니다. CSRF_COOKIE_HTTPONLY를 사용하여 Django CSRF 토큰을 Angular에 전달을 참조하세요.

참고 URL : https://stackoverflow.com/questions/18156452/django-csrf-token-angularjs

반응형