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

Django Rest Framework + AngularJS: Correct way for 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 post: 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 post 时(例如,此 post:User Authentication in Django Rest Framework + Angular.js web app ) 答案不包括以下行:

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

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

您的第二种方法 ($httpProvider.defaults) 可能是最好的方法。参见angular docs on http herexsrfCookieNamexsrfHeaderName 选项在 Angular 中相对较新。 (我认为它们是在 1.3 中出现的,如果没记错的话……)所以您发现的其他代码可能早于更新、更好的方法。无需在模板中进行呈现或转义调用 = 更清晰的代码。