[英]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.