angular - 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();
解决方案
您从 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)
})
...
推荐阅读
- android - 回收站视图中的 VIewPager 不加载数据 onResume
- node.js - Firestore 删除除 ONE 以外的所有字段
- android - 如果不允许第三方应用程序和应用程序在 Playstore 中存在,如何在 android 中记录通话
- c++ - C++11 中的连词类型特征
- javascript - 内容丰富的 API 引发奇怪的错误
- amazon-web-services - AWS 使用 Angular 502 错误放大 SPA 无法满足请求
- c# - 无法投射到界面
- c - 使用 atoi 将 argv[1] 读入说“key”。应该只接受 int。如果输入像 3g 这样的非整数,我该如何拒绝是非整数
- python - 展开递归表达式
- video - ffmpeg 现在是否支持动态重新配置过滤器图?