Spring Authorization Server获取Access Token报错:客户端认证失败
问题分析与解决方案
核心错误点
授权类型拼写错误
你写的grant_type:client_credential少了末尾的s,标准的Client Credentials授权类型应为client_credentials,拼写错误会导致服务器无法识别授权模式,触发认证失败。客户端认证方式完全错误
Client Credentials模式下,客户端身份认证需要使用客户端自身的凭证(client_id和client_secret),而非普通用户的账号密码。你当前用Basic认证传递user/password,服务器无法匹配客户端凭证,直接报错。客户端配置可能缺失必要项
需确保Authorization Server中客户端oidc-client的配置包含:- 允许
client_credentials授权类型 - 启用对应的客户端认证方式(如
client_secret_basic或client_secret_post)
- 允许
修复步骤
1. 修正请求参数
把请求负载中的grant_type改为正确值:
grant_type:client_credentials
2. 修正认证方式(二选一)
方式一:使用Basic认证传递客户端凭证
去掉请求体中的client_id和client_secret,将Basic认证的用户名设为oidc-client,密码设为secret,请求体仅保留grant_type=client_credentials。方式二:在请求体中传递客户端凭证
若你的客户端配置允许client_secret_post认证方式,可不用Basic认证,直接在请求体中传递完整参数:grant_type:client_credentials client_id:oidc-client client_secret:secret
3. 验证客户端配置
检查Authorization Server的客户端配置代码,确保包含以下关键项(以快速开始示例为例):
@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient oidcClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("oidc-client") .clientSecret("{noop}secret") // 快速开始中使用明文(noop),生产环境需替换为加密密码 .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) // 启用Basic认证方式 .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) // 允许Client Credentials授权 .scope(OidcScopes.OPENID) .build(); return new InMemoryRegisteredClientRepository(oidcClient); }
内容的提问来源于stack exchange,提问作者Bagira
相关产品推荐
相关产品推荐

