1

我有一个服务,它为其服务公开了许多 Jax-RS 接口。我现在想使用这些接口来连接服务。我正在使用 Quarkus,这意味着我正在使用 microprofile rest 客户端。因为我已经有了 JaxRS 接口,所以使用 @RegisterRestClient 方法并不可行。相反,我使用的是 RestClientBuilder。

    MyService client = RestClientBuilder.newBuilder()
        .baseUri(URI.create("https://localhost:8080"))
        .build(MyService.class);

我遇到的问题是身份验证。我需要访问的服务被锁定在基本身份验证之后。我为微配置文件 REST 客户端找到的所有指南都是对此的变体,其中解决方案是添加 headerparam。然而这是不可能的,因为我已经预先制作了界面,并且复制粘贴整个内容以添加标题参数确实是我宁愿避免的事情。

还应该提到的是,我已经尝试使用@Provider 过滤器来设置标题,但我似乎无法弄清楚如何使用该方法仅针对单个 REST 客户端,我有几个。

那么:如何使用微配置文件休息客户端设置基本身份验证而不弄乱 Jax-Rs 接口本身?

4

2 回答 2

1

您应该能够@ClientHeaderParamMyService. 就像是:

@Path("/my")
@ClientHeaderParam(name = "Authorization", value = "{lookupAuth}")
public interface MyService {

  default String lookupAuth() {
    return "Basic " + 
         Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
  }
}

有关更多详细信息,请参阅

如果无法修改接口,您有两种选择:

  • 创建一个扩展您使用此注解的接口:
@ClientHeaderParam(name = "Authorization", value = "{lookupAuth}")
public interface MyServiceWrapper extends MyService {
  default String lookupAuth() {
    return "Basic " + Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
  }
}
  • 创建一个ClientRequestFilter填充Authorization标题:
@Priority(Priorities.AUTHENTICATION)
public class BasicRequestFilter implements ClientRequestFilter {
    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, getAccessToken());
    }

    private String getAccessToken() {
        return "Basic " + Base64.getEncoder().encodeToString("someuser:somepass".getBytes());
    }
}

并注册过滤器,例如以编程方式:

MyService client = RestClientBuilder.newBuilder()
    .register(BasicRequestFilter.class)
    .baseUri(URI.create("https://localhost:8080"))
    .build(MyService.class);
于 2021-06-23T15:05:28.273 回答
0

您可以注册每个实例org.jboss.resteasy.client.jaxrs.internal.BasicAuthentication(或者您可以编写类似的组件)并使用 RestClientBuilder 注册它。

于 2021-06-24T05:40:30.157 回答