You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置带client_secret_post认证的Quarkus OIDC Client秘钥

问题分析与解决方案

首先你混淆了两个核心概念:OIDC客户端的凭证和用户的登录凭证,这也是你报错的根源。

1. quarkus.oidc-client.credentials.client-secret.value到底是什么?

这个配置项里的mysecret,是你在认证服务器上注册Quarkus应用作为OIDC客户端时,服务器生成的客户端密钥——简单说,就是你的Quarkus应用本身作为一个客户端,向认证服务器证明自己身份的密码,和用户的username/password完全是两回事。

你之前尝试填对象路径、JSON、变量名都是错的,这个值必须是认证服务器给你的那个字符串密钥。

2. 你的场景需要用「资源所有者密码凭证授权模式」

你的需求是通过POST提交用户的username、password、tenant、role来获取令牌,这对应OIDC的资源所有者密码凭证授权模式,不是单纯的客户端凭证认证,所以之前的配置方向不对。

3. 正确配置步骤

第一步:基础OIDC客户端配置

先在application.properties里配置Quarkus OIDC客户端的基本信息(替换成你的认证服务器实际值):

# 认证服务器的issuer地址,Quarkus会自动发现其配置
quarkus.oidc-client.auth-server-url=https://你的认证服务器地址/realms/你的租户
# 你在认证服务器注册的客户端ID
quarkus.oidc-client.client-id=你的客户端ID
# 你在认证服务器注册的客户端密钥(就是之前搞不懂的mysecret)
quarkus.oidc-client.credentials.client-secret.value=认证服务器给你的客户端密钥
# 启用密码授权模式
quarkus.oidc-client.grant.type=password

第二步:在代码中传递用户凭证和额外参数

因为你需要传递tenant、role这些标准密码模式之外的参数,不能只靠配置,得通过代码手动构建请求:

import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClientException;
import io.quarkus.oidc.client.Tokens;
import jakarta.inject.Inject;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import java.util.Map;

@Path("/auth")
public class AuthResource {

    @Inject
    OidcClient oidcClient;

    @POST
    @Path("/login")
    public Tokens login(String username, String password, String tenant, String role) {
        try {
            // 构建包含额外参数的请求体
            Map<String, String> params = Map.of(
                "username", username,
                "password", password,
                "tenant", tenant,
                "role", role
            );
            // 发送请求获取令牌
            return oidcClient.getTokens(params).await().indefinitely();
        } catch (OidcClientException e) {
            throw new RuntimeException("认证失败", e);
        }
    }
}

4. 解释你遇到的异常

  • java.util.NoSuchElementException: No value present:通常是因为Quarkus找不到有效的客户端凭证值,要么是你填的client-secret.value不对,要么是授权模式配置错误,导致Quarkus无法正确获取凭证。
  • io.quarkus.oidc.OIDCException:是OIDC客户端交互的通用异常,根源还是前面的凭证或模式配置问题。

额外注意事项

  • 确认你的认证服务器已经启用了密码授权模式(很多OIDC服务器默认禁用这个模式,因为安全性较低)。
  • 如果tenant是认证服务器的租户标识,可能不需要放在请求体里,而是直接包含在auth-server-url的realms路径中,具体要看你的认证服务器要求。

内容的提问来源于stack exchange,提问作者EnricoNiccoli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:57:34