Django + Angular 5 开发设置 CSRF 处理
Django + Angular 5 development setup CSRF handling
在 CSRF 验证方面,我当前的开发设置有点问题。由于我是 运行 一个 angular 开发服务器和一个 django 开发服务器并排并且(自然地)需要向后端发送请求,CSRF 成为一个问题。 Django 通常在用户连接时分发令牌,但现在前端和后端如此断开连接,我无法以自然方式获得 CSRF 令牌。
我现在尝试的是添加一个 @csrf_exempt
装饰函数来获取 cookie,也通过使用 @ensure_csrf_cookie
装饰该函数。我遇到的问题是,仍然在为包含 CSRF 令牌的请求设置适当的 header 时,服务器仍然 returns 给我一条消息,说没有包含 CSRF cookie(废话!)。
所以,我的问题首先是如何为 CSRF 令牌正确设置 header,这就是我目前的做法(下面的打字稿):
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=' 并保留令牌本身。我应该 trim 去掉 'csrftoken=' 部分还是留在那里?
这是我想用来获取更新的 cookie 的 django 视图:
@csrf_exempt
@ensure_csrf_cookie
def get_csrf_token(request):
return HttpResponse(status=200)
请求通过函数,但是当我手动检查我拥有的当前 cookie 时 document.cookies
我发现它仍然是没有更新的旧 cr脚 cookie :(.
我考虑过使用 django 中的 CSRF_USE_SESSIONS 设置来强制每个请求发送更新的 CSRF,但这对于这样一个简单的问题来说似乎有点过分了。
请指教!
答案在于我需要在我的 http 请求上设置另一个选项。该请求有另一个名为 withCredentials
的选项字段,需要将其设置为 true 以包含 CSRF 信息。
我还需要对我得到的 cookie 进行子字符串化,以便只包含 CSRF 令牌而不带前缀 "csrftoken=",这是在我提取它的构造函数内的注释行中完成的。
在 CSRF 验证方面,我当前的开发设置有点问题。由于我是 运行 一个 angular 开发服务器和一个 django 开发服务器并排并且(自然地)需要向后端发送请求,CSRF 成为一个问题。 Django 通常在用户连接时分发令牌,但现在前端和后端如此断开连接,我无法以自然方式获得 CSRF 令牌。
我现在尝试的是添加一个 @csrf_exempt
装饰函数来获取 cookie,也通过使用 @ensure_csrf_cookie
装饰该函数。我遇到的问题是,仍然在为包含 CSRF 令牌的请求设置适当的 header 时,服务器仍然 returns 给我一条消息,说没有包含 CSRF cookie(废话!)。
所以,我的问题首先是如何为 CSRF 令牌正确设置 header,这就是我目前的做法(下面的打字稿):
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=' 并保留令牌本身。我应该 trim 去掉 'csrftoken=' 部分还是留在那里?
这是我想用来获取更新的 cookie 的 django 视图:
@csrf_exempt
@ensure_csrf_cookie
def get_csrf_token(request):
return HttpResponse(status=200)
请求通过函数,但是当我手动检查我拥有的当前 cookie 时 document.cookies
我发现它仍然是没有更新的旧 cr脚 cookie :(.
我考虑过使用 django 中的 CSRF_USE_SESSIONS 设置来强制每个请求发送更新的 CSRF,但这对于这样一个简单的问题来说似乎有点过分了。
请指教!
答案在于我需要在我的 http 请求上设置另一个选项。该请求有另一个名为 withCredentials
的选项字段,需要将其设置为 true 以包含 CSRF 信息。
我还需要对我得到的 cookie 进行子字符串化,以便只包含 CSRF 令牌而不带前缀 "csrftoken=",这是在我提取它的构造函数内的注释行中完成的。