Django csrf 토큰 + Angularjs
mod_wsgi를 사용하여 아파치 서버에서 django를 실행하고 django가 아닌 아파치에서 직접 제공하는 angularjs 앱이 있습니다. django 서버 (rest_framework 실행)에 POST 호출을하고 싶지만 csrf 토큰에 문제가 있습니다.
{% csrf token %}
템플릿의 일부로 넣지 않고 서버에서 서버를 설정하는 방법이 토큰 이 페이지가 통과하지 않기 때문에?
- GET 요청을 통해 csrf 토큰을 쿠키로 받고 싶습니다.
- 그런 다음 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-TOKEN
POST / 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
'ProgramingTip' 카테고리의 다른 글
자바 펼쳐 추가 세부 사항 AFTER 요소 (0) | 2020.11.20 |
---|---|
이 장고 정규식은 무엇을 의미합니까? (0) | 2020.11.20 |
pandas 데이터 프레임 그룹 별 datetime 월 (0) | 2020.11.19 |
이 컬렉션 인스턴스에 [title] 속성이 없습니다. (0) | 2020.11.19 |
.NET 코어 MVC 컨트롤러의 단위 테스트를 위해 HttpContext를 모의 포장합니까? (0) | 2020.11.19 |