首页 > 解决方案 > spring boot angular csrf令牌握手错误

问题描述

所以我不断收到关于从我的前端(角度)到我的后端(springboot)的请求的错误。我假设我没有正确地将它从我的前端发送到后端。

弹簧安全配置:

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().disable()
                .csrf()
                .csrfTokenRepository (this.getCsrfTokenRepository())
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:4200");

            }
        };
    }
    private CsrfTokenRepository getCsrfTokenRepository() {
        CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
        tokenRepository.setCookiePath("/");
        return tokenRepository;
    }

角度要求:

 let url = "http://localhost:8080/api/v1/get_txt"
      this.http.get(url).subscribe(response => {
        console.log(response)

        // post request

        
      let _csrf = this.tokenExtractor.getToken() as string == null ? "test":this.tokenExtractor.getToken();
      const formData = new FormData();
      formData.append("name", "name")
      formData.append("_csrf", _csrf)
      let post = "http://localhost:8080/api/v1/testpost"

      this.http.post(post, formData, {
        headers: new HttpHeaders().set("X-XSRF-TOKEN", _csrf),//.set("Cookie", 'XSRF-TOKEN='+_csrf)
      })
        .subscribe(response => {
            console.log(response)
        })
      })

请求已发送的证明:已 发送 csrf 令牌

我还忘记提及的是我收到 403 错误。我会感谢每一个支持,但我不想禁用 csrf 令牌,也不想删除 spring boot 依赖项;)

我如何获得令牌:

app.module.ts:

    import:[HttpClientXsrfModule.withOptions({cookieName: 'XSRF-TOKEN'})]

app.component.ts
-> import
-> inject into constructor
let _csrf = this.tokenExtractor.getToken();

更新 我发现 spring boot 无法从请求中提取 cookie。 春季启动提取cookie错误 所以它必须是角度请求的错......

标签: angularspringspring-bootspring-securitycsrf

解决方案


您从 Angular 发送的标头名称旨在用作 HTTP 参数。在您的代码中,它将是let post = "http://localhost:8080/api/v1/testpost?_csrf=" + _csrf. 因此,当CookieCsrfTokenRepository设置为 CSRF 令牌存储库并且您想将其作为标头发送时,此令牌的默认标头名称为X-XSRF-TOKEN如此处所述):

this.http.post(post, formData, {
        headers: new HttpHeaders().set("X-XSRF-TOKEN", _csrf)
})
...

推荐阅读