为啥 quarkus.oidc.credentials.secret 被忽略?

Posted

技术标签:

【中文标题】为啥 quarkus.oidc.credentials.secret 被忽略?【英文标题】:Why is quarkus.oidc.credentials.secret being ignored?为什么 quarkus.oidc.credentials.secret 被忽略? 【发布时间】:2021-11-06 10:27:27 【问题描述】:

我有一个 SPA (Vue.js),它通过 REST 与 Quarkus 资源 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 进行身份验证,然后重定向到我的应用 ✅

然后我可以向我的 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"

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

后续问题:为什么不允许不记名?

【问题讨论】:

你的 pom.xml 中有 quarkus-oidc 依赖吗? 是的,quarkus-oidc。我之前什至有过 quarkus-keycloak-authorization,但我不确定是否需要它,所以我删除了它。 【参考方案1】:

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

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

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

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

【讨论】:

我更新了我的问题 - 但我现在会尝试您的解决方案。 我认为我的回答仍然有效,因为要使用 keycloak 授权,您需要一个启用了服务帐户的机密客户端 :) 我们到了 :) 现在我得到“客户端应用程序 [backend-client] 未注册为资源服务器。”我在哪里做呢? 你真的要使用keycloak授权吗?您将需要使用 keycloak admin ui(或 api)来定义谁可以在您的资源服务器上执行什么操作。如果您只想通过注释保护您的 api 路由(例如:@RoleAllowerd("ADMIN")),则不需要 keycloak autz。话虽如此,要将您的客户端变成资源服务器并启用细粒度授权,请选择访问类型机密,然后单击授权启用开关到打开,然后单击保存。然后,您可以在客户的授权选项卡中配置授权。 不记名令牌本身是安全的(您的 quarkus 应用程序使用签名 + 您的 keycloak 服务器的公钥检查其真实性),在这种情况下您实际上不需要使用客户端 ID/客户端密码.但是如果你想强制你的应用刷新用户信息,你可以在你的属性中添加 quarkus.oidc.user-info-required=true。

以上是关于为啥 quarkus.oidc.credentials.secret 被忽略?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?