1

我有一个SPA (Vue.js),它通过REST 与 Quarkus Resource API进行通信。我正在使用自己的Keycloak 进行身份验证/授权

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

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

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

我的 Quarkus API 的 application.properties:

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

我的 SPA 使用标准流程向 Keycloak 进行身份验证,然后重定向到我的应用 ✅</p>

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

为什么 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?

4

1 回答 1

3

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

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

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

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

于 2021-09-10T09:17:21.167 回答