Spring Security集成Huawei OAuth2遇'missing required parameter: client_id'问题
解决Spring Security OAuth2对接华为时"missing required parameter: client_id"问题
问题原因
Spring Security OAuth2客户端默认在获取token时,会将client_id和client_secret通过HTTP Basic认证头传递,但华为的OAuth服务要求这些参数必须放在x-www-form-urlencoded格式的请求体中,因此导致服务端无法识别到client_id,返回缺失参数的错误。
解决方案
方式一:修改配置文件(推荐)
在华为客户端的注册配置中,添加client-authentication-method: post,指定客户端凭证通过POST表单方式传递:
spring: security: oauth2: client: registration: huawei: client_id: blablabla client-secret: blablabla redirect-uri: 'http://localhost:8080/login/oauth2/code/huawei' scope: openid client-authentication-method: post # 关键配置:用POST表单传递客户端凭证 provider: huawei: authorization-uri: https://oauth-login.cloud.huawei.com/oauth2/v3/authorize token-uri: https://oauth-login.cloud.huawei.com/oauth2/v3/token user-info-uri: https://oauth-login.cloud.huawei.com/oauth2/v3/userinfo user-name-attribute: login
注意:原配置中huawei的provider配置直接写在client节点下,规范写法应放在provider子节点中,确保配置被正确识别。
方式二:Java代码自定义客户端配置
如果配置文件方式不生效(比如部分低版本Spring Security),可以通过Java配置类显式指定客户端认证方式:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.ClientAuthenticationMethod; @Configuration public class HuaweiOAuth2Config { @Bean public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository(huaweiClientRegistration()); } private ClientRegistration huaweiClientRegistration() { return ClientRegistration.withRegistrationId("huawei") .clientId("blablabla") .clientSecret("blablabla") .redirectUri("http://localhost:8080/login/oauth2/code/huawei") .scope("openid") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .clientAuthenticationMethod(ClientAuthenticationMethod.POST) // 指定POST表单传递凭证 .authorizationUri("https://oauth-login.cloud.huawei.com/oauth2/v3/authorize") .tokenUri("https://oauth-login.cloud.huawei.com/oauth2/v3/token") .userInfoUri("https://oauth-login.cloud.huawei.com/oauth2/v3/userinfo") .userNameAttributeName("login") .build(); } }
原理说明
设置client-authentication-method: post后,Spring Security会在向华为OAuth服务请求token时,将client_id、client_secret作为表单参数放入x-www-form-urlencoded格式的请求体中发送,完全匹配华为OAuth服务的参数要求,从而解决client_id缺失的错误。
内容的提问来源于stack exchange,提问作者Andrew Kuleshov
相关产品推荐
相关产品推荐

