繁体   English   中英

Spring WebClient 在 header 中设置承载身份验证令牌

[英]Spring WebClient set Bearer auth token in header

以下场景:

我有两个微服务 A 和 B。服务 A 是一个承载客户端,它有一个开放的 api 并接收来自必须由 keycloak 授权的客户端的请求。 现在我想从服务 A 向服务 B 发送一个授权的请求,服务 B 也是一个承载客户端。

我考虑过在 webclient builder 过程中将功能添加为过滤器 function,例如

@Bean
WebClient webClient() {
    return WebClient.builder()
            .filter(authHeader())
            .build();
}

private ExchangeFilterFunction authHeader(String token) {
    return (request, next) -> next.exchange(ClientRequest.from(request).headers((headers) -> {
        headers.setBearerAuth(token);
    }).build());
}

这是我在另一个问题中找到的一个例子。 这对我来说似乎是正确的方法,但我可以在配置的那个阶段提供“字符串令牌”参数吗?

我只是从RestTemplate切换到WebClient ,很抱歉,这是一个转储问题。

编辑:我可以在构建新的WebClient时手动设置 header 。

return WebClient.builder()
        .defaultHeader("Authorization", "Bearer "+ context.getTokenString())
        .build();

我从RestTemplate知道,它可以用作 Singleton。 还有一个KeyCloakRestTemplate自动注入 header。

WebClient是不可变的,所以当我注入它时,我不能只使用它然后添加 header。 另外,我不能在启动时设置这个 header 因为我必须等待一个请求来获取承载 header 并将其传递。所以我想除了这样做之外没有别的办法吗?

或者只是在发送过程中设置:

webClient.get()
    .uri(url)
    .headers(h -> h.setBearerAuth(token))
    .retrieve();

我最终在类似情况下使用了ExchangeFilterFunction过滤器。 就我而言,我有一个 Spring 组件,它检索要使用的令牌。 如果您的context.getTokenString()示例中的context是 Spring bean,您应该可以这样做:

@Bean
WebClient webClient(SomeContext context) {
    return WebClient.builder()
            .filter((request, next) -> next.exchange(
                    withBearerAuth(request, context.getTokenValue())))
            .build();
}

private static ClientRequest withBearerAuth(ClientRequest request, 
                                            String token) {
    return ClientRequest.from(request)
            .header(HttpHeaders.AUTHORIZATION, "Bearer " + token)
            .build();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM