将 OAuth2 添加到 spring-boot 时出现 CSRF-token 错误

Posted

技术标签:

【中文标题】将 OAuth2 添加到 spring-boot 时出现 CSRF-token 错误【英文标题】:CSRF-token error when added OAuth2 to spring-boot 【发布时间】:2018-02-17 19:54:01 【问题描述】:

我已将 OAuth2 添加到我的 spring-boot 应用程序中,到目前为止我只使用 google 作为登录名。登录部分工作正常,但当我发送 POST 请求时,我收到以下错误


    "timestamp": 1504901957320,
    "status": 403,
    "error": "Forbidden",
    "message": "Could not verify the provided CSRF token because your session was not found.",
    "path": "/compute"

现在我知道我可以在春季禁用 CSRF,但这不是最佳做法。 spring-boot 是自动设置 CSRF 令牌还是我必须添加一些东西才能使其工作。现在我不知道问题是否出在我没有添加令牌的角度代码发出请求时

let headers = new Headers();
headers.append("Content-Type", "application/json");

this.http.post("/compute", JSON.stringify(source),  headers ).subscribe((response: Response) => 
  if (response.ok) 
    this.mainpage.terminalComponent.logToTerminal(new Date(), response.text());
  
); 

或者我没有创建令牌并从后端设置它?

【问题讨论】:

headers 没有附加CSRF 令牌 好吧!我刚开始使用 Angular,所以一切对我来说都是新的。如何获取令牌并将其附加到headers?顺便说一句,感谢您的快速回答! @Aravind 【参考方案1】:

据此官方Spring Security and Angular JS tutorial。 Angular 内置了对 CSRF 的支持。

Angular 有基于 cookie 的 built in support for CSRF(它称之为“XSRF”)。

您可以在 Spring Boot 端使用自定义过滤器,将名为 XSRF-TOKEN 的 cookie 发送回 Angular。

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter 
  @Override
  protected void configure(HttpSecurity http) throws Exception 
    http
      .httpBasic().and()
      .authorizeRequests()
        .antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll().anyRequest()
        .authenticated().and()
      .csrf()
        .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
  

有关详细信息,请阅读题为“CSRF 保护”的教程部分。

【讨论】:

Spring 有很好的 csrf 文档:检查 spring doc 对于角度指南,检查 angular doc 希望对您有所帮助...

以上是关于将 OAuth2 添加到 spring-boot 时出现 CSRF-token 错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Twitch 进行身份验证时的 Spring-Boot OAuth2 奇怪行为

使用 spring-boot OAuth2 服务器保护的 Spring-boot 应用程序

让 oauth2 与 spring-boot 和 rest 一起工作

Spring-boot OAuth2 实现:NoSuchBeanDefinitionException:没有 AuthenticationManager 类型的合格 bean

spring-boot oauth2 拆分授权服务器和资源服务器

springboot