首页 > 解决方案 > Spring使用自定义请求配置WebClient Oauth2身份验证

问题描述

在对用作所有实例的基础的ServerOAuth2AuthorizedClientExchangeFilterFunctiona 应用过滤器时,我无法理解如何自定义使用 Oauth2 发出的身份验证请求。WebClient.BuilderWebClient

系统本身在工作,请求是根据Oauth2规范生成的。但是,我的身份验证服务有一些额外的字段需要存在才能使身份验证工作。这就是问题所在,到目前为止,我找不到任何合理的方法来添加我需要的字段或自定义请求本身。

到目前为止,我唯一能找到的就是实现一个ReactiveOAuth2AuthorizedClientManager. 但是我对此非常抗拒,因为没有可以扩展的该接口的通用实现,并且所有可用的实现都final可以扩展并且不能扩展。由于我的用例只是向请求正文添加一个字段,我希望有更好的方法来实现这一点。

任何帮助将不胜感激。谢谢你的时间。

我想要达到的目标

有什么阻碍

配置

@Configuration
public class WebClientConfig {

    @Bean("azure")
    public ReactiveClientRegistrationRepository getRegistration(
            @Value("${spring.security.oauth2.client.provider.azure.token-uri}")
            String tokenUri,
            @Value("${spring.security.oauth2.client.registration.azure.client-id}")
            String clientId,
            @Value("${spring.security.oauth2.client.registration.azure.client-secret}")
            String clientSecret,
            @Value("${spring.security.oauth2.client.registration.azure.authorization-grant-type}")
            String authorizationGrantType
    )
    {
        ClientRegistration registration = getClientRegistration(
                "azure",
                tokenUri,
                clientId,
                clientSecret,
                getAuthorizationGrantType(authorizationGrantType)
        );
        return new InMemoryReactiveClientRegistrationRepository(registration);
    }

    protected AuthorizationGrantType getAuthorizationGrantType(@Value("${spring.security.oauth2.client.registration.azure.authorization-grant-type}") String authorizationGrantType) {
        return new AuthorizationGrantType(authorizationGrantType);
    }

    protected ClientRegistration getClientRegistration(
            String registrationId,
            String tokenUri,
            String clientId,
            String clientSecret,
            AuthorizationGrantType authorizationGrantType
    ) {
        return ClientRegistration
                    .withRegistrationId(registrationId)
                    .tokenUri(tokenUri)
                    .clientId(clientId)
                    .clientSecret(clientSecret)
                    .authorizationGrantType(authorizationGrantType)
                    .build();
    }

    @Bean
    public ServerOAuth2AuthorizedClientExchangeFilterFunction  oauth2AuthenticationFilter(
            @Qualifier("azure") ReactiveClientRegistrationRepository clientRegistrations
    ) {
        ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
                clientRegistrations,
                        new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
        oauth.setDefaultClientRegistrationId("azure");
        oauth.setDefaultOAuth2AuthorizedClient(true);
        return oauth;
    }

    @Bean("base")
    public WebClient.Builder webClientBaseBuilder()
    {
        return WebClient.builder();
    }

    @Bean
    @Primary
    public WebClient.Builder webClientBuilderWithFilters(
            @Qualifier("base") WebClient.Builder baseBuilder,
            ServerOAuth2AuthorizedClientExchangeFilterFunction  oauth2AuthenticationFilter
    ) {
        return baseBuilder
                .filter(oauth2AuthenticationFilter);
    }

    @Bean
    public WebClient webClient(
            @Value("${api.appId}") String appId,
            @Value("${api.url}") String url,
            WebClient.Builder builder
    ) {
        return builder
                .baseUrl(url)
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .defaultHeader("Application-Id", appId)
                .build();
    }

}

标签: springspring-bootspring-security-oauth2spring-webclient

解决方案


请参阅 spring 安全文档,假设您正在使用客户端凭据授予

如果需要自定义Token Request的预处理,可以给DefaultClientCredentialsTokenResponseClient.setRequestEntityConverter()提供一个自定义的Converter<OAuth2ClientCredentialsGrantRequest, RequestEntity<?>>

https://docs.spring.io/spring-security/site/docs/current/reference/html5/#customizing-the-access-token-request-3


推荐阅读