【发布时间】:2018-10-09 09:01:22
【问题描述】:
这是我昨天提出的一个问题的后续问题: CSRF token in Angular 4 CLI from Django
我有一个后端 Django 服务器和一个前端 Angular 应用程序。我正在尝试使用 POST 将 Angular 中的表单提交到 Django 后端。问题在于 CSRF 令牌。
这是 Django 视图:
#@csrf_exempt
def empty_form(request):
if request.method=="POST":
message = "Post"
else:
message = "Get"
return JsonResponse({'message': message})
这是 Angular 组件:
send_sample_form() {
let d = new Date();
d.setTime(d.getTime() + 1 * 24 * 60 * 60 * 1000);
let expires:string = "expires=" + d.toUTCString();
let cpath:string = '/';
// this.cookieService.set('csrftoken', this.server_token, d, cpath, '127.0.0.1', false);
this.cookieService.set('csrftoken', this.server_token);
let my_headers = new HttpHeaders(
{
'X-CSRFToken': this.server_token
}
);
this.http.post('http://127.0.0.1:8000/emptyform/',
{'my_form': this.sample_form.value},
{headers: this.server_token, withCredentials: true})
.subscribe(
(response) => {
console.log(response);
}
);
}
当 Angular 和 Django 是单独的服务器(localhost:4200 和 127.0.0.1:8000)时,Angular 代码不会获取 CSRF 令牌。当我在生产模式下运行它并且只有 Django 服务器位于 127.0.0.1:8000 时,现在 Angular 组件能够通过以下方式提取 CSRF 令牌:
ngOnInit() {
this.http.get('http://127.0.0.1:8000/generate_token/', { observe: 'response' })
.subscribe(
(response) => {
this.server_token = this.cookieService.get('csrftoken');
console.log(this.server_token);
});
}
但我已经尝试了 Cookie 服务的 set() 方法的所有可能版本,但仍然从 Django 获得 403。
this.cookieService.set('csrftoken', this.server_token, d, cpath, '127.0.0.1', false); 要么 this.cookieService.set('csrftoken', this.server_token);
为了检查 Django 服务器,我使用 Postman 向我的 Django 服务器发送请求。一个 get 请求给了我一个 CSRF 令牌。当我发出 POST 请求时,我需要一个 CSRF cookie 和一个标头“X-CSRFToken”来返回状态 200 或者我得到一个 403。所以 Django 服务器 CSRF 中间件似乎正在工作,因为它确实返回了 200当请求具有 CSRF cookie 和 XCSRFToken 标头时。
我试图考虑如果请求具有来自 Angular 前端的正确 CSRF cookie,我是否可以签入 Django 视图函数。我使用“csrf_exempt”让 POST 通过,并试图找到一种方法来提取 CSRF cookie 并进行目视检查,但找不到这样做的方法。有没有办法在 Django 视图中提取 CSRF cookie 并将其打印出来?喜欢吗?
打印(请求['csrftoken'])
整个代码在我的 GitHub 上: https://github.com/shivkiyer/djangoangular
【问题讨论】:
标签: django angular cookies csrf