带有 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 指南中所示那样构建客户端 :)
我已经尝试了好几天了,我不确定我是否遗漏了什么。
我有一个 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 指南中所示那样构建客户端 :)