You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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总是提前退出,未完成认证流程

调试过程

  1. 在HttpSecurity中发现两个核心OAuth2过滤器:OAuth2AuthorizationRequestRedirectFilter和OAuth2LoginAuthenticationFilter
  2. 首次访问localhost:8082(所有端点需认证)时,OAuth2AuthorizationRequestRedirectFilter执行,创建OAuth2AuthorizationRequest并存入会话
  3. 点击Discord授权后,请求重定向回应用,但OAuth2AuthorizationRequestRedirectFilter仅将请求委托给下一个过滤器,OAuth2LoginAuthenticationFilter未处理该回调请求
  4. 多次授权后,会话中已保存包含Discord返回授权码的DefaultSavedRequest,但系统始终未进入获取AccessToken的阶段,页面再次跳转回Discord认证页面
  5. 确认授权码有效:通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:59