首页 文章

Django Angular 5开发设置CSRF处理

提问于
浏览
0

在CSRF验证方面,我目前的开发设置存在一些问题 . 由于我正在并行运行角度开发服务器和django开发服务器,并且(当然)需要向后端发送请求,因此CSRF成为一个问题 . 当用户连接时,Django通常会将令牌移出,但是现在前端和后端都是如此断开连接,我没有以自然的方式获得CSRF令牌 .

我现在尝试的是添加一个 @csrf_exempt 装饰函数,以便能够获取cookie,也可以通过使用 @ensure_csrf_cookie 来修饰函数 . 我遇到的问题是,当为请求设置适当的标头以包含CSRF令牌时,服务器仍然会返回一条消息,说明CSRF cookie未被包含(废话!) .

所以,我的问题首先是如何正确设置CSRF令牌的标头,这就是我目前的做法(下面的打字稿):

constructor(private httpClient: HttpClient) {
    const cookies = document.cookie.split(';');
    for (let cookie of cookies) {
      cookie = cookie.trim();
      const re = new RegExp('^csrftoken');
      if (re.test(cookie)) {
        this.csrfToken = cookie;
        // this.csrfToken = cookie.substr(10, cookie.length);
        break;
      }
    }
    console.log('[RequestService] Got token: ' + this.csrfToken);
  }

  post(url: string, body: {}) {
    return this.httpClient.post(url, body, { headers: new HttpHeaders({ 'x-csrftoken': this.csrfToken }) });
  }

正如您在上面所看到的,我已经注释掉了cookie提取的一部分 . 注释部分将删除最初的'csrftoken ='并保留令牌本身 . 我应该删除'csrftoken ='部分还是留在那里?

这是我想用来获取更新cookie的django视图:

@csrf_exempt
@ensure_csrf_cookie
def get_csrf_token(request):
    return HttpResponse(status=200)

该请求进入该功能,但当我手动检查我与 document.cookies 的当前cookie时,我发现它仍然是相同的旧蹩脚cookie没有更新:( .

我想在django中使用CSRF_USE_SESSIONS设置来强制每个请求发送更新的CSRF,但这对于这样一个简单的问题来说似乎有些过分 .

请指教!

1 回答

  • 0

    答案在于我需要在我的http请求中设置另一个选项 . 该请求有另一个名为 withCredentials 的选项字段,需要设置为true才能包含CSRF信息 .

    我还需要将我所获得的cookie子串到仅包含CSRF令牌,而不包括前置的“csrftoken =”,这是在我提取它的构造函数中的注释掉的行中完成的 .

相关问题