我一直在努力在Django和Angular之间进行配置,但我缺少一些东西。建议这样做的方法是什么?
Angular具有一些XSRF保护,但是自从AngularJS以来,它已经发生了变化,我发现了很多过时的信息或手册。 Django使用了一些默认设置,但是它们在Angular中表现不佳。
在DRF和Angular之间解决CSRF的电池方式是什么?
答案 0 :(得分:0)
HTTP Guide中介绍了Angular推荐的方法,但是对于我们中的某些人来说,它有一些棘手的步骤。幸运的是,在最新版本的Angular中,您需要进行的更改很少。一旦设置完成,所有默认/推荐的CSRF中间件都将表现良好。这里有一些信息DRF-specific,也有对Django official documentation
的引用目前对我有用的最小更改(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应该可以被Java脚本访问,因此httpOnly
标志不应设置为True
。
在这里,我假设您已经具有功能验证系统,并且同时使用django.contrib.sessions.middleware.SessionMiddleware
和django.middleware.csrf.CsrfViewMiddleware
(通常您会在{{ 1}})。
然后,在斜角侧激活CSRF:
MIDDLEWARE
如果您不想更改CSRF标头和Cookie的Django默认名称,则可以改为Angular端,方法是将settings.py
行更改为:
# app.module.ts
import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';
...
@NgModule({
imports: [
// ...
HttpClientModule,
HttpClientXsrfModule,
]
// ...
我尚未完全测试此配置。请记住,在Django方面,您必须稍微更改HttpClientXsrfModule,
(至少:连字符到下划线和HttpClientXsrfModule.withOptions({
cookieName: 'csrftoken',
headerName: 'X-CSRFTOKEN',
}),
前缀)。前面的示例应与CSRF_HEADER_NAME
的默认值匹配。缺省的HTTP_
Django设置为HTTP_X_CSRFTOKEN
(小写)。
如果您对自定义命名有疑问,请检查Angular插入的实际标头(使用浏览器的开发人员工具),然后可以通过调试CSRF_COOKIE_NAME
的内容来再次检查如何在Django中接收标头< / p>