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 从客户端到资源的令牌中继

通过 Spring Boot Keycloak 集成的 OAuth2 客户端凭据流

Webflux - Spring Boot - 具有 http 代理支持的 oAuth2 客户端