当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 2和OAuth2客户端凭据不支持的授予类型

子车鸿运
2023-03-14

我想使用Spring Security的资源服务器和我的组件中包含的授权服务器来保护我的应用程序。所需的流包括仅使用客户端凭据授予类型并将client_id与client_secret一起传递为bas64标头,在命中oauth/Token终结点后,应该返回令牌以用于进一步的请求。我还包括grant_type:POST请求参数中的客户端凭据

目前我收到错误:“访问此资源需要完全身份验证”。奇怪的是,尽管我进行了配置,Spring仍然会生成控制台日志中可以看到的随机安全密码。

这是我对Spring Security的第一个方法,所以也许我错过了什么?

下面是我的配置

授权服务器配置:

@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();
}     
}

ResourceServerConfig:

@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());
}
}

我使用的是SpringBoot2.0.1。释放和Spring安全OAuth2.0.14。释放在我的例子中,如果使用InMemoryTokenStore,它将与一个实例一起工作,那么如果要创建应用程序的多个实例,最好的替代方法是什么?

共有1个答案

邓鸿雪
2023-03-14

当您将用户存储在内存中时,您提供的是纯文本密码,然后当您试图从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("{noop}somePass") //change here
            .refreshTokenValiditySeconds(24*3600);
}

还可以在WebSecurity配置器中更改您的用户,并对密码执行相同的操作。

 类似资料:
  • 我开发Spring Cloud(使用Netflix OSS堆栈)微服务架构已经有一段时间了。正如您所料,我已经将授权服务器分离为一个独立的微服务。我的前端应用程序使用“密码”授权类型用于用户登录目的。但是,对于从前端服务到其他后端服务的rest调用,我使用的是“Client-Credentials”授权类型。客户机凭据授予类型也在其他后端服务中使用。通过这样做,我无法确定谁是请求的实际调用者(当前

  • 我可以使用,其中一个keycloak客户机与另一个keycloak客户机通信。然而,只有当我登录到第一个keycloak客户机时,它才起作用,即它向keycloak服务器发送客户机ID、客户机机密、用户名和密码。如果我没有在第一个客户机上使用用户和密码进行身份验证,我会得到“无法设置授权头,因为没有身份验证原则”。但是我已经将keycloak配置为对第一个客户机使用服务帐户(客户机凭据授权),因此

  • 我正在玩这里描述的客户端凭据授予流https://msdn.microsoft.com/en-us/office/office365/howto/building-service-apps-in-office-365 这是我最初的授权申请:https://login.microsoftonline.com/common/oauth2/authorize?nonce = c43a 377 e-8b

  • null 用户在登录表单中输入凭据->应用程序1将使用用户凭据从应用程序2获取令牌,其具有密码授予类型->使用令牌访问应用程序1的资源。 问题是Spring Security 5是否支持客户端的密码授予类型?我在Spring Security 5实现中找到了所有rest授予类型,但没有找到密码。

  • 顺便说一句,这些微服务只会通过中间件层互相交谈,我的意思是不需要用户凭据来允许授权(用户登录过程如Facebook)。 我在Internet上寻找了一些示例,展示了如何创建一个授权和资源服务器来管理这种通信。然而,我只是找到了一些例子,解释了如何使用用户凭据(三条腿)来实现它。 有没有人有在Spring Boot和Oauth2中如何做的样例?如果有可能提供更多关于所用范围的详细信息,令牌交换将不胜

  • 我们有一个第三方移动应用程序。它在登录过程中创建一个访问令牌,以使用授权码授权流访问我们的API(.netcore)之一。 https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-protocols-oauth-code 该移动应用程序显示了许多互动程序。登录后,当用户单击其中一个互动程序时,我想调用另一个。netcor