Angular5没有设置X-XSRF-TOKEN标头

时间:2018-03-27 15:55:18

标签: angular cookies angular5 csrf-protection

我已经阅读了很多解决方案,但没有一个能为我工作。

这个github问题基本上是我的问题(https://github.com/angular/angular/issues/20511

我使用的是Angular 5.2.5,Chrome版本65.0.3325.146,Spring boot 1.5.4。

在我的登录表单上,我首先发送GET请求以获取XSRF cookie。然后我发送一个包含登录信息的帖子

Send GET request that returns Set-Cookie header

Send POST request and get 403

使用CSRF

配置的Spring启动应用程序
        http
            .csrf()
            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

我正在使用Angular webpack代理,因此网址是相对的,并通过withCredentials选项发送请求。

我也尝试按照Github问题的建议编写我自己的拦截器,但是在尝试获取令牌let token = this.tokenExtractor.getToken() as string;时我得到了null我已经在Postman中检查过了cookie将httpOnly标志设置为false

1 个答案:

答案 0 :(得分:2)

我一直有同样的问题。我刚刚用一点黑客来修复它

    // function to get cookie by name
    getCookie(cname) {
            var name = cname + "=";
            var decodedCookie = decodeURIComponent(document.cookie);
            var ca = decodedCookie.split(';');
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i];
                while (c.charAt(0) == ' ') {
                    c = c.substring(1);
                }
                if (c.indexOf(name) == 0) {
                    return c.substring(name.length, c.length);
                }
            }
            return "";
        }

getItemsFromServer(){

    let httpOptions={
                headers: new HttpHeaders({
                    'Content-Type': 'application/json',
                    'X-XSRF-TOKEN': this.getCookie("XSRF-TOKEN")
                }),
                withCredentials: true
            };

    this.httpClient.get(url, httpOptions)
    .subscribe(response=>{
    // more code here
    }
    );
}