我一直在为 Django 和 Angular 之间的配置而苦苦挣扎,但我遗漏了一些东西。推荐的方法是什么?
Angular 有一些 XSRF 保护,但自 AngularJS 以来它发生了变化,我发现了很多过时的信息或手册。Django 使用一些默认值,但它们在 Angular 中表现不佳。
在 DRF 和 Angular 之间解决 CSRF 的包含电池的方法是什么?
HTTP 指南中解释了 Angular 推荐的方法,但对于我们中的一些人来说,它有一些棘手的步骤。幸运的是,在最新版本的 Angular 中,您只需要进行很少的更改。一旦设置完成,所有默认/推荐的 CSRF 中间件都表现良好。有一些特定于 DRF 的信息以及对Django 官方文档的参考
目前对我有用的最小更改(Django 2.1、Angular 6 和最新版本的依赖项)如下
首先,您需要设置 Django 以按照 Angular 的预期发送 cookie:
# settings.py
CSRF_USE_SESSIONS = False
CSRF_COOKIE_HTTPONLY = False # this is the default, and should be kept this way
CSRF_COOKIE_NAME = 'XSRF-TOKEN'
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN'
警告!请记住,cookie 名称区分大小写。我在那里浪费了很多时间:(
请注意,CSRF cookie 应该可以通过 Javascript 访问,因此httpOnly
不应将标志设置为True
。
在这里,我假设您已经拥有一个功能性身份验证系统并且正在使用django.contrib.sessions.middleware.SessionMiddleware
和django.middleware.csrf.CsrfViewMiddleware
(通常您会在 中的MIDDLEWARE
变量中找到列出的那些模块settings.py
)。
然后,在 angular 一侧激活 CSRF:
# app.module.ts
import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';
...
@NgModule({
imports: [
// ...
HttpClientModule,
HttpClientXsrfModule,
]
// ...
如果您不想更改 CSRF Header 和 Cookie 的 Django 默认名称,您可以改为在 Angular 端更改它们,方法是更改HttpClientXsrfModule,
以下行:
HttpClientXsrfModule.withOptions({
cookieName: 'csrftoken',
headerName: 'X-CSRFTOKEN',
}),
我还没有完全测试过这个配置。请记住,在 Django 方面,您必须稍微更改CSRF_HEADER_NAME
(至少:连字符到下划线和HTTP_
前缀)。前面的示例应该匹配 的默认值HTTP_X_CSRFTOKEN
。默认的CSRF_COOKIE_NAME
Django 设置是csrftoken
(小写)。
如果自定义命名有问题,请检查 Angular 插入的实际标题(使用浏览器的开发人员工具),您可以通过调试 request.META
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句