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

多RSA密钥对下JWT认证请求实现及私钥使用疑问

JWT认证令牌生成的两个疑问:多RSA密钥对处理与私钥传入逻辑

我们使用以下代码生成JWT访问令牌:

OAuth.OAuthToken oAuthToken = apiClient.requestJWTUserToken(
           configuration.getUserId(),
           configuration.getImpersonatedUserId(),
           scopes,
           privateKeyBytes,
           TOKEN_EXPIRATION_IN_SECONDS);

其中第4个参数为RSA密钥对的私钥,存在两个疑问:

  1. 当应用关联多个RSA密钥对时,该如何发送请求?
  2. 文档提及签名需包含头部、载荷以及公钥+私钥,但为何上述代码仅传入私钥?

1. 多RSA密钥对场景下的代码实现

当应用关联多个RSA密钥对时,核心是根据请求场景或服务要求选择匹配的私钥,常见实现方式有两种:

方式一:按密钥标识(kid)映射选择

如果你的密钥对有唯一标识(kid),可以维护一个私钥映射表,根据业务逻辑动态选择对应私钥:

// 初始化私钥映射表,key为密钥标识kid,value为私钥字节数组
Map<String, byte[]> privateKeyMap = new HashMap<>();
privateKeyMap.put("user-service-key", loadPrivateKey("path/to/user-key.pem"));
privateKeyMap.put("admin-service-key", loadPrivateKey("path/to/admin-key.pem"));

// 自定义逻辑获取当前请求需要的密钥标识
String targetKid = getRequiredKeyId();
byte[] selectedPrivateKey = privateKeyMap.get(targetKid);

// 生成令牌
OAuth.OAuthToken oAuthToken = apiClient.requestJWTUserToken(
           configuration.getUserId(),
           configuration.getImpersonatedUserId(),
           scopes,
           selectedPrivateKey,
           TOKEN_EXPIRATION_IN_SECONDS);

方式二:按业务场景直接切换

如果不同业务分支对应固定密钥对,可直接在对应分支中传入指定私钥:

byte[] targetPrivateKey;
if (isAdminOperation()) {
    targetPrivateKey = loadPrivateKey("path/to/admin-private-key.pem");
} else {
    targetPrivateKey = loadPrivateKey("path/to/regular-private-key.pem");
}

OAuth.OAuthToken oAuthToken = apiClient.requestJWTUserToken(
           configuration.getUserId(),
           configuration.getImpersonatedUserId(),
           scopes,
           targetPrivateKey,
           TOKEN_EXPIRATION_IN_SECONDS);

注意:若API客户端支持在JWT头部指定kid,需确保所选私钥对应的公钥已在认证服务器注册,且头部kid与服务器端公钥标识一致,否则服务器无法匹配公钥完成签名验证。

2. 代码仅传入私钥的原因

JWT签名的核心逻辑决定了生成阶段只需要私钥,具体原因如下:

  • 签名生成仅需私钥:JWT签名是用私钥对Base64编码后的头部+载荷的哈希值进行加密的过程,整个流程不需要公钥参与。
  • 公钥用于验证阶段:公钥的作用是认证服务器验证令牌合法性时使用——服务器用公钥解密签名,对比解密后的哈希值与头部+载荷的哈希值是否一致,以此确认令牌未被篡改。
  • API封装逻辑:apiClient.requestJWTUserToken方法已经封装了完整的JWT生成流程,公钥由认证服务器提前持有(比如通过配置或JWKS端点获取),因此生成令牌时无需传入公钥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:47