Angular2 和 Django:CSRF 令牌头痛

Angular2 and Django: CSRF Token Headache

我遇到的问题

客户端代码:

private _editUserUri = "http://127.0.0.1:8000/search/edit/user/";

constructor(private _http: Http){}

getCookie(name) {
    let value = "; " + document.cookie;
    let parts = value.split("; " + name + "=");
    if (parts.length == 2) 
      return parts.pop().split(";").shift();
}

validateData(userdata) {
    return true;
}

editUser(userdata) {

    console.log("UserService: createUser function called");
    console.log(JSON.stringify(userdata));

    if(this.validateData(userdata)) {

        let headers = new Headers({
            'Content-Type': 'application/json',
            'X-CSRFToken': this.getCookie('csrftoken')
        });

        let options = new RequestOptions({ headers: headers });

        return this._http
            .post(
                this._editUserUri,
                JSON.stringify(userdata),
                options)
            .map(res => {
                console.log(res.json());
                return res.json();
            })
    }

}

header (x-csrftoken) 中 csrf 令牌的屏幕截图。这正是 Django 所期望的 (source)

我尝试过/考虑过的

如果有人能提供帮助,我将不胜感激!

尼克

我认为问题是您的请求只有 CSRF 令牌 header,但没有 cookie(请参阅针对 CSRF 的 double submit 缓解措施,您发送的 header应该与 cookie 进行比较)。

虽然我不太明白到底发生了什么。如果您详细说明 Angular 应用程序的下载位置以及它如何从不同来源的 Django 获取 CSRF cookie,我可能可以编辑此答案以提供更多帮助。我不明白的是,如果 Angular 应用程序是从端口 A 下载的,它从哪里为端口 B 上的 Django 提供 CSRF cookie。

编辑:

啊,你正在使用 CORS。我认为您需要 jQuery 请求中的 withCredentials 以便 csrf cookie 与请求一起发送:

xhrFields: {
    withCredentials: true
}

Django 然后需要发送 Access-Control-Allow-Credentials: true 我想。