Django Rest Framework + AngularJS:CSRF保护的正确方法?

时间:2015-07-13 00:25:36

标签: angularjs django django-rest-framework django-csrf csrf-protection

没有Django Rest Framework,我曾经创建过类似的表单/ POST请求:

<form id='loginForm' method="post" action="/register/">{% csrf_token %}
    ...
</form>

但我在前端盯着使用Django Rest Framework和AngularJS,我不知道如何使用CSRF令牌,所以我决定做一些研究。我遇到了这个网站:http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html如果您向下滚动到“Interlude:AngularJS + CSRF Protection”部分,它说我需要添加以下脚本:

// Add the CSRF Token
var app = angular.module('example.app'); // Not including a list of dependent modules (2nd parameter to `module`) "re-opens" the module for additional configuration
app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common['X-CSRFToken'] = '{{ csrf_token|escapejs }}';
}]);

然后我遇到了这个SO帖子:Django csrf token + Angularjs,其中说在添加

之后
django.middleware.csrf.CsrfViewMiddleware

到我的MIDDLEWARE_CLASSES是settings.py,我需要添加的是以下几行

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

请注意,当我查看解释如何使用DRF和AngularjS进行用户身份验证/注册的其他SO帖子时(例如,此帖子:User Authentication in Django Rest Framework + Angular.js web app),答案不包括以下行:

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

话虽如此,使用Django Rest Framework和AngularJS添加CSRF保护的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

你的第二种方式($httpProvider.defaults)可能是最好的方式。请参阅angular docs on http herexsrfCookieNamexsrfHeaderName选项在Angular中相对较新。 (我认为如果内存服务的话,它们会进入1.3版本。)所以你发现的其他代码可能只是更早,更好的方法。不需要在template = cleaner代码中进行渲染或转义调用。