带有 Keycloak 的 Quarkus GraphQL 客户端

Quarkus GraphQL Client with Keycloak

我已经尝试了好几天了,我不确定我是否遗漏了什么。

我有一个 Quarkus GraphQL 服务,如下所示:https://quarkus.io/guides/smallrye-graphql

而且我已经设置了 Keycloak 来保护它。

现在我想像这里一样使用 Qute 和 GraphQL Smallrye 客户端创建一个客户端:https://quarkus.io/guides/smallrye-graphql-client

客户端可以连接到服务,但我总是收到“数据获取错误:io.quarkus.security.UnauthorizedException”。

GraphQL 客户端似乎没有正确发送 header 或者它没有发送任何 ...

有谁知道我如何告诉客户在每次调用时从 keycloak 发送授权 header?

PS:我用一个简短的 React 前端测试了它并且它正在工作,所以它似乎是 headers 的 graphql 客户端问题......一些想法?

不确定您使用的是动态客户端还是类型安全客户端,所以我将对两者进行描述。

对于这两种类型,如果您有一个在应用程序生命周期内不会更改的密钥,您可以通过添加配置 属性 来配置它,如下所示: quarkus.smallrye-graphql-client.CLIENT_NAME.header.HEADER_NAME=HEADER_VALUE (参见 https://quarkus.io/guides/all-config#quarkus-smallrye-graphql-client_quarkus-smallrye-graphql-client-smallrye-graphql-client

如果值可以随时间变化,我可能会建议使用编程构建器而不是使用静态配置的客户端,如下所示:

DynamicGraphQLClientBuilder.newBuilder()
   .header("KEY", "VALUE") // obtain the correct value from Keycloak and pass it here
.... 

如果值发生变化,则构建一个新的客户端实例。

对于类型安全的客户端,annotation-based 方法在 https://smallrye.io/smallrye-graphql/1.4.3/typesafe-client-headers/

中描述

虽然我对 Keycloak 了解不多,所以我无法评论您如何从中获取 header 值。 让我知道其中一些对您有用

似乎没有动态的方法来将 keycloak header 添加到调用中。

我找到了一个解决方案,至少只要令牌有效就可以工作。

为此,我正在使用一个客户端 Class,它有一个 GraphQL 客户端的接口 Object 并在 constructor.I 中注入 header 将需要添加一些代码来更新令牌,但现在就可以使用它了:)

对于那些想要一些代码的人:

@Singleton
public class Client {

    public IClient client;

    public Client(JsonWebToken accessToken) {
        client = TypesafeGraphQLClientBuilder.newBuilder()
                .header("Authorization", "Bearer " + accessToken.getRawToken())
                .build(IClient.class);
    }
}

有了这个,可以像 Quarkus 指南中所示那样构建客户端 :)