【发布时间】:2020-07-19 19:53:01
【问题描述】:
我正在使用 Ionic Framework 开发一个应用程序,并为我的后端生成了一个 JHipster 项目。我的 JHipster 项目在额外的服务器上运行,并通过我的应用程序的 REST 请求调用。所以我现在的问题是处理 CORS 和 CSRF 配置。
我的 JHipster 项目有自己的前端,它在同一个域上运行,并且在测试时我可以毫无问题地访问我的后端。但是,当我想从 Ionic 应用程序调用服务器上的后端时,我的 xsrf 令牌不会正确更新,因此我无法访问我的后端。我已经尝试了来自不同堆栈溢出帖子的几种解决方案,但没有一个对我有用。
例如:
到目前为止我做了什么:
- 我在我的 JHipster 项目的 SecurityConfiguration 中启用了 csrf
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
.exceptionHandling()
.authenticationEntryPoint(problemSupport)
.accessDeniedHandler(problemSupport)
- 添加了 CORS 配置
cors:
allowed-origins: 'http://localhost:8100, ionic://localhost, http://localhost'
allowed-methods: 'POST, GET, OPTIONS, DELETE, PUT, HEAD'
allowed-headers: 'Origin, X-Requested-With, Content-Type, Accept, x-auth-token, Authorization, X-CSRF-Token, x-xsrf-token, XSRF-TOKEN'
exposed-headers: 'Authorization,Link,X-Total-Count,XSRF-TOKEN, X-XSRF-TOKEN'
allow-credentials: true
max-age: 86400
- 写了一个拦截器
@Injectable()
export class HttpXSRFInterceptor implements HttpInterceptor {
constructor(private tokenExtractor: HttpXsrfTokenExtractor, private csrfService:CSRFService, private $sessionStorage: SessionStorageService) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const headerName = 'XSRF-TOKEN';
const respHeaderName = 'X-XSRF-TOKEN';
let token = this.tokenExtractor.getToken() as string;
if (token !== null && !req.headers.has(headerName)) {
req = req.clone({ headers: req.headers.set(respHeaderName, token) });
req.clone({
withCredentials: true
});
}
return next.handle(req);
}
}
- 在我的 app.module.ts 和拦截器中添加了 HttpClientXsrfModule
HttpClientXsrfModule.withOptions({
cookieName: 'XSRF-TOKEN',
headerName: 'X-XSRF-TOKEN',
}),
{
provide: HTTP_INTERCEPTORS,
useClass: HttpXSRFInterceptor,
multi: true
},
我的问题:
在浏览器中启动我的应用程序时,我没有获得 xsrf 令牌,但是在我发送发布请求后,令牌被设置为 cookie。
例如登录时,由于缺少令牌,第一次尝试失败,但第二次登录请求成功,因为现在 xsrf 令牌的响应标头不再为空。此外,即使服务器响应的标头中有新令牌,令牌也不会自行更新。
据我了解
我第一次获得我的令牌应该是在加载我的应用程序的起始页面之后立即
应在服务器(后端)每次响应后更新令牌,并将更新后的令牌用于下一个请求
因此我的问题是这两个问题都没有发生,我不知道如何解决它。
感谢您的帮助!
干杯
【问题讨论】:
标签: ionic-framework spring-security cors jhipster csrf