我们正在使用Angular和Spring Boot构建Web应用程序。作为我们的安全措施之一,我们使用CSRF令牌。问题是,在我们的本地计算机上,令牌验证有效,但在我们的登台服务器上,令牌不会由前端发送。这个问题突然发生了;在使用令牌的头几个月里,我们没有遇到这个问题。经过一定的构建,他们开始失败。过了一会儿,他们再次工作,但现在又停止了工作。
因此,似乎存在我们未能看到的环境问题。
Spring正在创建CSRF令牌并在预检(OPTIONS)请求中发送它。它将令牌封装在Set-Cookie标头中,Angular使用CookieXSRFStrategy进行读取。同样,在本地这可以正常工作,但在我们的登台服务器上,这会失败。问题是Angular在收到令牌后没有设置cookie。我们通过检查Google Dev Console中的Cookie来检查这一点。
Spring给出的具体错误是:
在请求参数' _csrf'上找到了无效的CSRF令牌。要么 标题' X-CSRF-TOKEN'
我们无法登录,因为Spring没有收到CSRF令牌。因此,除非我们完全关闭CSRF保护,否则我们无法对应用程序执行任何操作。
我们目前的解决方法是完全禁用CSRF保护,以便在寻找解决方案时能够继续开发。
有没有人知道会出现什么问题?
答案 0 :(得分:0)
在传递无效的 CSRF令牌时,在请求参数'_csrf'或标题'X-CSRF-TOKEN'上发现无效的CSRF令牌。如果Spring根本没有收到任何CSRF令牌,它将打印另一条消息“无法验证提供的CSRF令牌,因为找不到会话”。这意味着前端正在发送旧的或无效的CSRF令牌。
您的公司网络代理可能会应用一些登录机制并覆盖您的X-CSRF-TOKEN标头。
根据Spring Security documentation,需要cookieHttpOnly = false才能允许AngularJS读取XSRF-TOKEN cookie。