Spring Security OAuth2授权服务器/oauth2/token端点返回404未找到问题求助
问题分析与解决方案
你的核心问题是使用GET请求访问/oauth2/token端点,而Spring Security OAuth2授权服务器的该端点默认仅支持POST请求,这直接导致了404错误。除此之外,还有客户端认证方式的配置细节需要调整,以下是具体的分析和修复步骤:
1. 必须使用POST请求获取Access Token
/oauth2/token是OAuth2规范定义的令牌端点,Spring Security OAuth2授权服务器严格遵循规范,仅接受POST请求(表单格式参数)。你当前用GET请求传递参数,服务器无法匹配到对应的端点处理逻辑,因此返回404。
正确的请求示例(以curl为例)
curl -X POST http://127.0.0.1:8080/oauth2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ # 你的客户端配置了CLIENT_SECRET_BASIC,因此使用HTTP Basic认证头传递凭证 -u client:password \ -d "grant_type=authorization_code" \ -d "code=YOUR_AUTHORIZATION_CODE" \ -d "redirect_uri=http://127.0.0.1:4200/authorized" \ -d "code_verifier=YOUR_CODE_VERIFIER"
2. 客户端认证方式的补充配置
你的客户端当前只配置了CLIENT_SECRET_BASIC认证方式,这意味着只能通过HTTP Basic认证头传递客户端凭证。如果希望支持通过表单参数(client_id和client_secret)传递凭证,需要在客户端配置中添加CLIENT_SECRET_POST认证方式:
RegisteredClient client = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("client") .clientSecret(passwordEncoder.encode("password")) .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) // 新增该行 .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN) .redirectUri("http://127.0.0.1:4200/authorized") .scope(OidcScopes.OPENID) .scope("read") .scope("write") .build();
3. 其他需要注意的细节
- redirect_uri必须完全匹配:获取token时的
redirect_uri必须和获取授权码时使用的redirect_uri完全一致,不能有任何差异(比如结尾斜杠、域名大小写等)。 - 避免重复创建客户端:你当前的
registeredClientRepository方法每次启动都会查询并保存客户端,可能导致数据库中出现重复记录。建议使用UUID.randomUUID().toString()生成客户端ID(替代自定义的UserIdGenerator.generateClientId()),并确保仅在客户端不存在时执行保存逻辑(你的代码已经实现了这一点)。 - 过滤器链顺序正确:你的
AuthorizationServerConfig中的SecurityFilterChain设置了@Order(Ordered.HIGHEST_PRECEDENCE),这是正确的,确保授权服务器的端点优先被处理,不会被DefaultSecurityConfig的过滤器链拦截。
内容的提问来源于stack exchange,提问作者Mukendi Emmanuel
相关产品推荐
相关产品推荐

