簡體   English   中英

Spring WebClient 配置 Okta OAuth2

[英]Spring WebClient Configuration Okta OAuth2

我正在構建一個 API 網關,它使用 Spring Webflux,Spring 雲網關,Z38008DD81C2F4D798Z5ECF6 用於 OCEAF21D798ZECF6

這是我的 RouteLocator,我可以通過它調用我的 Foo 微服務。

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder, TokenRelayGatewayFilterFactory filterFactory) {
    return builder.routes()
            .route("foo", r ->
                    r.path("/foo")
                            .filters(f -> f
                                    .rewritePath("/foo", "/api/v1/foo")
                                    .filter(filterFactory.apply()))
                            .uri("lb://foo-service")
            )
            .build();
}

這工作得很好。

但是,由於我需要聚合不同微服務的結果,比如說 Foo 和 Bar,我正在創建一個負載平衡的 Spring WebClient bean,我可以使用它來進行 http 調用:

@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder() {
    return WebClient.builder();
}

如何配置 WebClient 以在每個請求上傳遞令牌,就像 TokenRelayGatewayFilterFactory 在 RouteLocator 中所做的那樣?

編輯:

這是我更新的 WebClient bean:

@Bean
@LoadBalanced
public WebClient.Builder webClientBuilder(ReactiveClientRegistrationRepository clientRegistrations,
                                          ServerOAuth2AuthorizedClientRepository authorizedClients) {
    var oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations, authorizedClients);
    oauth.setDefaultOAuth2AuthorizedClient(true);
    oauth.setDefaultClientRegistrationId("okta");
    return WebClient
            .builder()
            .filter(oauth);
}

現在它似乎在 Chrome 瀏覽器上運行。 登錄 Okta 后,我可以通過 Http GET 訪問 Foo 微服務上的 /foo。 雖然當我通過 Postman 在 /foo 上嘗試 Http POST 時(在添加授權標頭時),但我收到了 302 響應,將我重定向到 Okta ZFC35FDC70D5FC69D269883A822C7A 頁面。

有趣的是,使用 RouteLocator 我沒有得到任何重定向,GET 和 POST 都通過 Postman 工作。 重定向似乎僅在使用 WebClient 時發生。

知道為什么嗎?

編輯#2:

我的安全配置文件:

@Configuration
@EnableWebFluxSecurity
class SecurityConfig {

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http
                .csrf().disable()
                .authorizeExchange().anyExchange().authenticated()
                .and()
                .oauth2Login()
                .and()
                .oauth2ResourceServer().jwt()
                .and()
                .and().build();
    }

    @Bean
    CorsWebFilter corsWebFilter(){
        CorsConfiguration corsConfig = new CorsConfiguration();
        corsConfig.setAllowedOrigins(List.of("*"));
        corsConfig.setMaxAge(3600L);
        corsConfig.addAllowedMethod("*");
        corsConfig.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", corsConfig);

        return new CorsWebFilter(source);
    }
}

看看 ServletOAuth2AuthorizedClientExchangeFilterFunction (或反應式等效)這個視頻更詳細地介紹了它: https://youtu.be/v2J32nd0g24?t=2168

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM