首页 文章

从Angular 4到Django的CSRF令牌

提问于
浏览
0

这是我昨天问的一个问题的后续问题: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)时,角度代码不会获得CSRF令牌 . 当我在 生产环境 模式下运行它,因此在127.0.0.1:8000只有Django服务器时,现在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和一个 Headers '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

1 回答

  • 1

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

相关问题