在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 回答
答案在于我需要在我的http请求中设置另一个选项 . 该请求有另一个名为
withCredentials
的选项字段,需要设置为true才能包含CSRF信息 .我还需要将我所获得的cookie子串到仅包含CSRF令牌,而不包括前置的“csrftoken =”,这是在我提取它的构造函数中的注释掉的行中完成的 .