【问题标题】:adding JWT token in request in reactive way in webflux在 webflux 中以反应方式在请求中添加 JWT 令牌
【发布时间】:2020-06-01 16:06:42
【问题描述】:

我正在使用WebClient 调用由 JWT 令牌保护的 Rest API。 //获取Token

JwtToken token = client.post()
                .uri("")
                .body(BodyInserters.fromFormData("username", "XXX")
                        .with("password", "XXXXX"))
                .retrieve()
                .bodyToFlux(JwtToken.class)
                .onErrorMap(e -> new Exception("Error While getting Token", e))
                .blockLast(); 

//调用安全API

 WebClient client = consorsWebClientBuilder
                .defaultHeaders(token.bearer())
                .build();

              client
                .get()
                .uri(someURI)
                .retrieve()
                .bodyToMono(String.class)

我在反应链中打电话给Block,所以网络通量不高兴并说

block()/blockFirst()/blockLast()是阻塞的,线程reactor-http-client-epoll-12不支持这个

如何以反应方式添加令牌? 注意,我可以创建过滤器但仍然在过滤器中,我还需要调用Block

【问题讨论】:

    标签: spring-boot spring-webflux spring-webclient


    【解决方案1】:

    还有另一种添加方法,即使用filterWebClient 中实现ExchangeFilterFunction,如下所示:

    WebClient.builder().filter(setJWT());
    
    private ExchangeFilterFunction setJWT() {
            return ExchangeFilterFunction.ofRequestProcessor((clientRequest) -> {
                ClientRequest authorizedRequest = ClientRequest.from(clientRequest).header("AUTHORIZATION","{LOGIC TO GET THE TOKEN}").build();
                return Mono.just(authorizedRequest);
            });
        }
    

    此实现将在实际调用 API 之前接受请求并添加 JWT 令牌。

    【讨论】:

      【解决方案2】:
      I used map for this, not the best solution but does the work
      
      Mono<JwtToken>  token = client.post()
                      .uri("")
                      .body(BodyInserters.fromFormData("username", "XXX")
                              .with("password", "XXXXX"))
                      .retrieve()
                      .bodyToMon(JwtToken.class)
                      .onErrorMap(e -> new Exception("Error While getting Token", e))
      
      
      return token
           .flatMap(token -> callApi(request, token));
      

      【讨论】:

      【解决方案3】:

      您可以使用doOnSuccess

      client.post()
            .uri("")
            .body(BodyInserters.fromFormData("username", "XXX")
                          .with("password", "XXXXX"))
            .retrieve()
            .bodyToFlux(JwtToken.class)
            .onErrorMap(e -> new Exception("Error While getting Token", e))
            .doOnSuccess(jwtToken -> {
                      client.header(HttpHeaders.AUTHORIZATION, "bearer " + jwtToken)
                            .get()
                            ...
            })
      

      【讨论】:

      • 感谢您检查这一点,因为我想返回响应最终使用地图。因为我不能从 doOnSuccess 中返回值
      猜你喜欢
      • 2016-03-17
      • 2019-05-29
      • 2019-03-23
      • 1970-01-01
      • 2021-11-28
      • 2021-05-22
      • 2021-08-16
      • 2020-11-09
      • 1970-01-01
      相关资源
      最近更新 更多