为 client_credentials 流配置 Spring OAuth2 客户端

Configuring Spring OAuth2 Client for client_credentials flow

我们为我们的 oauth2 客户端准备了以下客户端配置,它与 spring boot 1.4.0 配合得很好:

@Configuration
@ConfigurationProperties(prefix = "pmc.oauth.client")
public class OAuthClientConfig {

@NotNull
private String scope;

@NotNull
private String clientSecret;

@NotNull
private String clientId;

@NotNull
private String accessTokenUri;

private int clientReadTimeout = 60000;
private int clientConnectTimeout = 60000;

@Bean
public OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails() {
    ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
    resourceDetails.setAccessTokenUri(accessTokenUri);
    resourceDetails.setClientId(clientId);
    resourceDetails.setClientSecret(clientSecret);
    resourceDetails.setScope(Collections.singletonList(scope));
    return resourceDetails;
}

@Bean
public OAuth2ClientContext oauth2ClientContext() {
    DefaultOAuth2ClientContext defaultOAuth2ClientContext = new DefaultOAuth2ClientContext();
    return defaultOAuth2ClientContext;
}

@Bean
public OAuth2RestTemplate oAuth2RestTemplate(OAuth2ProtectedResourceDetails oAuth2ProtectedResourceDetails, OAuth2ClientContext oauth2ClientContext) {
    OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(oAuth2ProtectedResourceDetails, oauth2ClientContext);
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

    restTemplate.setRequestFactory(factory);
    return restTemplate;
}
}

更新到 Spring-Boot 1.4.1 后,我注意到在自动装配 OAuth2RestTemplate 时,OAuth2ProtectedResourceDetails 的另一个实现优先(由于 org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ProtectedResourceDetailsConfiguration - 在我们自己定义的 ClientCredentialsResourceDetails 类型的 bean 上将 AuthorizationCodeResourceDetails bean 标记为主要 bean 的自动配置。

我知道我可以通过不自动装配 rest 模板 bean 的 resourceDetails 和 clientContext 并直接提供具体实现来解决这个问题,但我只是想知道我们是否正在以非预期的方式配置我们的 rest 模板spring队?

关于如何为 client_credentials 流程正确配置我们的休息模板有什么想法吗?

干杯, 本

我现在陷入了同样的问题。我的解决方案是为我的 ResourceDetails bean 使用命名 bean,并在我创建其余模板时使用 @Qualifier 注入正确的 bean(在您的情况下,在 oAuth2RestTemplate 方法的参数中)。

虽然在 1.4.0 和 1.4.1 之间进行版本升级,但如果知道此问题的确切原因会很高兴。

我也在为同样的问题苦苦挣扎。但是,我发现如果您添加注释 @EnableOAuth2Client 注释以及:

安全。oauth2.client.grant-type = client_credentials

您获得了正确注入的 ClientCredentialsResourceDetails 详细信息实例,而不是 AuthorizationCodeResourceDetails。此外,尝试排除 OAuth2ProtectedResourceDetailsConfiguration 也不起作用。它是一个私有包 class。如果您尝试按名称排除它,您将收到一条错误消息,指出它不是自动配置 class。查看 OAuth2RestOperationsConfiguration class 的代码。它是根据检查安全性中的属性来确定要分配哪个资源的。oauth2.client 前缀。