【问题标题】:CSRF tokens from Angular 4 to Django从 Angular 4 到 Django 的 CSRF 令牌
【发布时间】: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


    【解决方案1】:

    就这么简单:print(request.COOKIES['csrftoken'])

    【讨论】:

    • Django 视图中的 CSRF 令牌与 Angular 代码在控制台中输出的相同。但我仍然得到 403。那我还需要做什么?这是命令行中的错误“禁止(CSRF令牌丢失或不正确。)”
    • 您是否也收到了正确的x-csrftoken 标头?
    • 我做了一个 print(request.META) 并且没有 x-csrftoken。在我的 Angular 中,我使用 my_headers=new HttpHeaders('X-CSRFToken': this.server_token) 在 POST 请求中使用 {headers: my_headers} 选项添加它。为什么Angular在指定时不添加标题?
    猜你喜欢
    • 2018-05-10
    • 2013-08-11
    • 2016-08-03
    • 2021-07-14
    • 2015-01-17
    • 2016-09-28
    • 2014-08-31
    • 2019-06-13
    • 2012-01-26
    相关资源
    最近更新 更多