Discord OAuth2集成:OAuth2过滤器陷入循环,requiresAuthentication为false
Spring Security集成Discord OAuth2循环重定向问题
我正尝试使用Discord作为OAuth2身份提供商,配置代码如下:
@EnableWebSecurity @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.oauth2Login(); http.authorizeHttpRequests() .anyRequest().authenticated(); return http.build(); } @Bean public ClientRegistration clientRegistration() { ClientRegistration cr = ClientRegistration.withRegistrationId("discord") .clientId("123456") .clientSecret("ABCD") .scope(new String[]{"email", "identify"}) .authorizationUri("https://discord.com/oauth2/authorize") .tokenUri("https://discord.com/api/oauth2/token") .userInfoUri("https://discord.com/api/v10/users/@me") .userNameAttributeName("username") .clientName("Discord") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("http://localhost:8082/testauth") .build(); return cr; } @Bean public ClientRegistrationRepository clientRegistrationRepository() { // maps each ClientRepository to its registrationId return new InMemoryClientRegistrationRepository(clientRegistration()); } }
问题现象
每次重定向都会反复跳转到Discord认证页面。调试发现:
- 已从Discord获取授权码并存入会话,但系统从未发送AccessToken请求
OAuth2LoginAuthenticationFilter总是提前退出,未完成认证流程
调试过程
- 在
HttpSecurity中发现两个核心OAuth2过滤器:OAuth2AuthorizationRequestRedirectFilter和OAuth2LoginAuthenticationFilter - 首次访问
localhost:8082(所有端点需认证)时,OAuth2AuthorizationRequestRedirectFilter执行,创建OAuth2AuthorizationRequest并存入会话 - 点击Discord授权后,请求重定向回应用,但
OAuth2AuthorizationRequestRedirectFilter仅将请求委托给下一个过滤器,OAuth2LoginAuthenticationFilter未处理该回调请求 - 多次授权后,会话中已保存包含Discord返回授权码的
DefaultSavedRequest,但系统始终未进入获取AccessToken的阶段,页面再次跳转回Discord认证页面 - 确认授权码有效:通过Postman使用该授权码可正常从Discord获取令牌
可能的解决方案
1. 校验重定向URI一致性
Discord开发者后台配置的重定向URI必须与代码中redirectUri完全一致,包括协议、域名、端口和路径。当前代码配置为http://localhost:8082/testauth,需确保Discord后台已添加该URI。
2. 显式配置OAuth2回调路径
在oauth2Login中显式指定重定向端点路径,确保OAuth2LoginAuthenticationFilter能正确匹配回调请求:
http.oauth2Login(oauth2 -> oauth2 .redirectionEndpoint(re -> re.baseUri("/testauth")) );
3. 检查用户标识属性配置
Discord用户信息接口返回的username可能存在重复,建议使用唯一标识id作为用户名属性:
.userNameAttributeName("id")
4. 启用调试日志排查细节
添加Spring Security调试日志,查看过滤器执行流程和错误信息:
logging.level.org.springframework.security=DEBUG
5. 确认过滤器顺序
确保OAuth2LoginAuthenticationFilter在OAuth2AuthorizationRequestRedirectFilter之后执行,Spring Security默认会维护正确顺序,若有异常可显式配置验证:
http.addFilterAfter(new OAuth2LoginAuthenticationFilter(...), OAuth2AuthorizationRequestRedirectFilter.class);
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

