Ionic framework CSRF令牌未正确更新(爱奥尼亚&x2B;Spring安全性)

Ionic framework CSRF令牌未正确更新(爱奥尼亚&x2B;Spring安全性),ionic-framework,spring-security,cors,jhipster,csrf,Ionic Framework,Spring Security,Cors,Jhipster,Csrf,我正在使用Ionic框架开发一个应用程序,并为我的后端生成了一个JHipster项目。我的JHipster项目运行在一个额外的服务器上,通过我的应用程序的REST请求调用。所以我现在的问题是如何处理CORS和CSRF配置 我的JHipster项目有自己的前端,它运行在同一个域上,在测试时,我可以毫无问题地到达后端。但是,当我想从Ionic应用程序调用服务器上的后端时,我的xsrf令牌不会正确更新,因此,我无法访问后端。我已经从不同的堆栈溢出帖子中尝试了几种解决方案,但没有一种适合我 例如:

我正在使用Ionic框架开发一个应用程序,并为我的后端生成了一个JHipster项目。我的JHipster项目运行在一个额外的服务器上,通过我的应用程序的REST请求调用。所以我现在的问题是如何处理CORS和CSRF配置

我的JHipster项目有自己的前端,它运行在同一个域上,在测试时,我可以毫无问题地到达后端。但是,当我想从Ionic应用程序调用服务器上的后端时,我的xsrf令牌不会正确更新,因此,我无法访问后端。我已经从不同的堆栈溢出帖子中尝试了几种解决方案,但没有一种适合我

例如:

到目前为止我所做的:

  • 我在JHipster项目的安全配置中启用了csrf
  • 添加了CORS配置
  • 写了一个拦截器
  • 我的问题:

    在浏览器中启动我的应用程序时,我没有获得xsrf令牌,但在我发送post请求后,该令牌将被设置为cookie

    例如,在登录时,由于缺少令牌,第一次尝试失败,但第二次登录请求成功,因为现在xsrf令牌的响应头不再为null。此外,即使服务器响应的头中有一个新的令牌,令牌也不会自我更新

    据我了解

  • 我第一次获得代币应该是在加载应用程序的起始页之后

  • 每次来自服务器(后端)的响应之后都应该更新令牌,并且更新的令牌将用于下一个请求

  • 因此,我的问题是,这两个问题都不会发生,我不知道如何解决它

    谢谢你的帮助


    干杯

    我是《Ionic for JHipster》的作者,希望我能在这方面帮助你

    首先,除非您在同一端口上运行应用程序,否则CSRF不应该成为问题。根据我的经验,当您在不同的端口上运行它们时,您的客户端无法读取cookie。至于CORS,在本地运行时,这对我来说不是问题。我相信这是因为
    dev
    概要文件的CORS设置是完全开放的。您能否尝试在
    prod
    配置文件中使用
    dev
    配置文件中的设置,看看是否有帮助

    供参考的资料包括:

    jhipster:
      cors:
        allowed-origins: '*'
        allowed-methods: '*'
        allowed-headers: '*'
        exposed-headers: 'Authorization,Link,X-Total-Count'
        allow-credentials: true
        max-age: 1800
    

    如果可行,我会尝试将允许的原点更改为数组,或者只使用一个数组<代码>http://localhost:8100如果在本地运行,则应满足所有要求

    如果这样做有效,我会尝试将允许的来源更改为数组:因此我尝试按照您的建议更改我的cors设置,但我得到“在请求参数“\u CSRF”或标头“X-XSRF-Token”上发现无效的CSRF令牌“null”作为响应消息。也许我理解错了,但是如果我在localhost:8080上测试我的后端,在localhost:8100上测试我的爱奥尼亚应用程序,我会遇到问题,因为不同的端口?或者我的配置有问题,因为我在另一个域上运行我的后端作为我的ionic应用程序?
      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);
      }
    }
    
        HttpClientXsrfModule.withOptions({
          cookieName: 'XSRF-TOKEN',
          headerName: 'X-XSRF-TOKEN',
        }),
    
        {
          provide: HTTP_INTERCEPTORS,
          useClass:  HttpXSRFInterceptor,
          multi: true
        },
    
    jhipster:
      cors:
        allowed-origins: '*'
        allowed-methods: '*'
        allowed-headers: '*'
        exposed-headers: 'Authorization,Link,X-Total-Count'
        allow-credentials: true
        max-age: 1800