首页 > 解决方案 > 使用 Apple ID 登录的 Oauth2 会返回没有 CSRF 令牌的请求

问题描述

我正在尝试在 Spring Boot 应用程序中使用 Apple ID 实现登录。我目前正在使用它,以便获得 Apple 登录屏幕,并可以授权访问。但是,当 Apple 重定向回 时https://example.com/myapp/login/oauth2/apple,我的日志中出现以下错误:

2020-03-10 09:41:32.574 DEBUG 13644 --- [nio-8080-exec-5] o.s.security.web.FilterChainProxy        : /login/oauth2/code/apple at position 3 of 16 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2020-03-10 09:41:32.574 DEBUG 13644 --- [nio-8080-exec-5] o.s.security.web.FilterChainProxy        : /login/oauth2/code/apple at position 4 of 16 in additional filter chain; firing Filter: 'CsrfFilter'
2020-03-10 09:41:32.575 DEBUG 13644 --- [nio-8080-exec-5] o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for https://example.com/myapp/login/oauth2/code/apple

如何在不禁用 CSRF 设施的情况下使其正常工作?

标签: spring-bootsecurityoauth-2.0csrf-tokenapple-id

解决方案


问题出在“会话”cookie 中的 samesite=lax 中。因此,与登录相关的先前会话被浏览器阻止,并且在 Apple 重定向到 redirectUrl 后正在创建新会话。所有 POST 请求都会发生这种情况,因为这是安全问题,并且浏览器会丢弃跨域 cookie。为了解决这个问题,我在 chrome 中禁用了 samesite 并将以下配置添加到我的后端:

@Configuration
public class CookieConfiguration {

  @Bean
  public CookieSerializer cookieSerializer() {
    DefaultCookieSerializer serializer = new DefaultCookieSerializer();
    serializer.setSameSite("none");
    serializer.setUseSecureCookie(true);
    return serializer;
  }
}

我的 csrf 配置如下:

.csrf(c -> c
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
                    .ignoringAntMatchers("/login/oauth2/code/apple")
)

至少,这让我有机会测试我的代码。如果我找到如何在生产中解决这个问题,我会继续更新。


推荐阅读