为什么 quarkus.oidc.credentials.secret 被忽略了?

Why is quarkus.oidc.credentials.secret being ignored?

我有一个 SPA (Vue.js),它通过 REST 与 Quarkus 资源 API 进行通信。 我正在为 Authentication/Authorization.

使用自己的 Keycloak

在 Keycloak 中,我的领域中有两个客户端:

Client ID: frontend-client
Access Type: public
Standard Flow enabled

Client ID: backend-client
Access Type: bearer-only
Secret: mySecret

我的 application.properties 我的 Quarkus API:

quarkus.oidc.auth-server-url=https://localhost:8082/auth/realms/myrealm
#quarkus.oidc.client-id=backend-service
#quarkus.oidc.credentials.secret=mySecret

我的 SPA 使用标准流程通过 Keycloak 进行身份验证,然后重定向到我的应用程序 ✅

然后我可以向我的 API 发出请求并且一切正常 尽管 quarkus.oidc.client-id 和 quarkus.oidc.credentials.secret 被注释掉了 !这是为什么?当这些行未被注释掉但具有 false 值时,它也有效。

为什么 Quarkus 忽略这些行,更重要的是,它为什么有效?

更新 添加依赖项

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-keycloak-authorization</artifactId>
</dependency>

允许我将此添加到 application.properties:

quarkus.keycloak.policy-enforcer.enable=true

现在导致这个错误:

{"error":"invalid_client","error_description":"Bearer-only not allowed"}

但至少现在秘密没有被忽略,提供错误的秘密会导致正确的错误。

跟进问题:为什么不允许bearer-only?

我猜是因为您的 Quarkus 应用程序使用仅承载客户端,它只会使用签名检查承载令牌的真实性。

由于它不会调用 Keycloak 进行额外验证,因此它不会在您的属性中使用客户端 ID 和客户端密码。

如果您想让 quarkus 使用它,您需要将客户端类型更改为机密。

顺便说一句,在用于保护服务应用程序的 quarkus quickstart 中:keycloak 客户端使用机密客户端,并且 bearer only 设置为 false :https://github.com/quarkusio/quarkus-quickstarts/blob/main/security-openid-connect-quickstart/config/quarkus-realm.json#L395