Spring Boot 2 和 OAuth2 客户端凭据不受支持的授权类型
Posted
技术标签:
【中文标题】Spring Boot 2 和 OAuth2 客户端凭据不受支持的授权类型【英文标题】:Spring Boot 2 and OAuth2 client-credentials unsupported grant type 【发布时间】:2018-11-09 02:23:27 【问题描述】:我想使用我的组件中包含的 Spring Security 的资源服务器和授权服务器来保护我的应用程序。
所需的流程包括仅使用客户端凭据授予类型并将 client_id 与 client_secret 一起作为 base64 标头传递,在到达oauth/token
端点后应该为进一步请求返回令牌。我还在POST
请求参数中包含了grant_type: client-credentials
现在我收到错误:
"Full authentication is required to access this resource"
。
奇怪的是,尽管我的配置 Spring 仍然生成随机安全密码,可以在控制台日志中看到。
这是我第一次使用 Spring Security,所以也许我错过了什么?
下面是我的配置:
AuthorizationServerConfig:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends
AuthorizationServerConfigurerAdapter
@Override
public void configure(final AuthorizationServerSecurityConfigurer security)
security
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception
clients
.inMemory()
.withClient("some-client")
.authorizedGrantTypes("client-credentials")
.authorities("ROLE_CLIENT")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(3600)
.secret("somePass")
.refreshTokenValiditySeconds(24*3600);
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
endpoints
.tokenStore(tokenStore())
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
@Bean
public TokenStore tokenStore()
return new InMemoryTokenStore();
资源服务器配置:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(final HttpSecurity http) throws Exception
http
.authorizeRequests()
.antMatchers("/oauth/token", "/oauth/authorize", "/oauth/confirm_access").permitAll()
.antMatchers("/**").authenticated()
.and().httpBasic().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
我正在使用 Spring Boot 2.0.1.RELEASE 和 Spring Security OAuth2 2.0.14.RELEASE。 就我而言,使用 InMemoryTokenStore 它将与一个实例一起工作,如果要创建多个应用程序实例,最好的替代品是什么?
【问题讨论】:
你的项目中有 corsfilter 吗? 不,我的项目中没有 Corsfilter 【参考方案1】:当您将用户存储在内存中时,您是以纯文本形式提供密码,然后当您尝试从 DelegatingPasswordEncoder
检索编码器以验证密码时,它找不到。
您可以尝试以下更改,以便通过添加 noop
来覆盖密码编码
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception
clients
.inMemory()
.withClient("some-client")
.authorizedGrantTypes("client-credentials")
.authorities("ROLE_CLIENT")
.scopes("read", "write", "trust")
.accessTokenValiditySeconds(3600)
.secret("noopsomePass") //change here
.refreshTokenValiditySeconds(24*3600);
并在 WebSecurityConfigurer 中更改您的用户,对密码执行相同操作。
【讨论】:
以上是关于Spring Boot 2 和 OAuth2 客户端凭据不受支持的授权类型的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot 2.0.3 + 安全 + Oauth2 自动配置
Spring Boot 2 OIDC(OAuth2)客户端/资源服务器未在 WebClient 中传播访问令牌
如何在 Spring Boot 2 oauth2 中获取令牌?
Spring boot Oauth2:使用 Feign、Ribbon、Zull 和 Eureka 从客户端到资源的令牌中继