spring-boot - 使用 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 设施的情况下使其正常工作?
解决方案
问题出在“会话”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")
)
至少,这让我有机会测试我的代码。如果我找到如何在生产中解决这个问题,我会继续更新。
推荐阅读
- arraylist - foreach 语句中的 NullPointerException
- ios - 在 Objective-C 中从字节加载图像
- amazon-web-services - 从 AMI 构建 AWS Elastic Beanstalk 平台
- sql - 以今天为基本日期,然后计算前后5年的第N天`day-week`
- excel - Excel 宏通过 powershell 运行,但在 Windows 任务计划程序运行时不运行
- python-3.x - 如何从 Pandas 数据框中获取顺序事件对的计数?
- javascript - ASP.net MVC 下拉列表中的选定项目
- c# - c#: 从 protobuf 获取嵌套消息
- php - 如何将实现数组注入PHP中的构造函数
- algorithm - 如何创建像数独一样的逻辑纸笔游戏?