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

调用IRS A2A端点获取Access Token失败(错误码ESRV306)求助

解决IRS测试环境获取Access Token时的ESRV306错误(无效JWT)

问题场景

完成IRS 5718出版物要求的应用注册后,调用测试环境Access Token端点返回以下错误:

{
"error_code": "ESRV306",
"error_msg": {
"error": "invalid client",
"error_description": "The given JWT for client authentication is invalid."
}
}

代码问题分析与修复方案

1. 私钥完整性与匹配问题

  • 代码中privateKey和pkey为截断示例,需替换为完整的RSA私钥Base64内容(保留原始换行格式)。
  • 确保私钥与注册IRS应用时提交的公钥/证书完全匹配,密钥不匹配会直接导致签名验证失败。

2. JWT字段合规性修正

IRS对JWT字段有严格要求,需调整以下内容:

  • kid字段:将代码中的XXXXXXX替换为IRS注册系统中关联的真实密钥ID,大小写、字符需完全一致。
  • 时间字段:iat和exp必须是Unix时间戳(秒级),原代码直接使用DateTime.UtcNow会导致序列化错误,修正为:
    { "iat", ((DateTimeOffset)DateTime.UtcNow).ToUnixTimeSeconds() },
    { "exp", ((DateTimeOffset)DateTime.UtcNow.AddMinutes(15)).ToUnixTimeSeconds() }
    
  • aud字段:确认受众URL为IRS测试环境的正确Token端点(如https://test-api.irs.gov/oauth/token),不可混淆生产与测试地址。
  • jti字段:需转换为字符串格式,避免Guid类型序列化异常:Guid.NewGuid().ToString()。

3. JWT编码器参数冗余问题

检查JwtEncoder.Encode方法的参数:部分JWT库(如JWT.Net)的Encode方法无需单独传入私钥,因为算法实例已绑定密钥。原代码中传入privateKey可能导致签名逻辑错误,可调整为:

var token = encoder.Encode(jwtHeader, payload);

4. 请求格式验证

获取Access Token的POST请求需严格符合OAuth 2.0客户端凭证流程:

  • Content-Type必须为application/x-www-form-urlencoded
  • 参数需包含:
    • grant_type=client_credentials
    • client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
    • client_assertion=生成的JWT字符串

修正后的核心代码示例

internal string GenerateJWTToken(string issuer, string subject, string audience)
{
    // 替换为完整的私钥Base64内容
    string privateKey = @"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCuxJr5bETbAhvq
I4X28UBoyGcAN91ug5rFPQ...完整密钥内容...";
    var rsaParams = ReadAsymmetricKeyParameter();
    var encoder = GetRS256JWTEncoder(rsaParams);

    var jwtHeader = new Dictionary<string, object>
    {
        { "kid", "真实密钥ID" }
    };

    var now = DateTime.UtcNow;
    var payload = new Dictionary<string, object>
    {
        { "iss", issuer},
        { "sub", subject },
        { "aud", audience },
        { "iat", ((DateTimeOffset)now).ToUnixTimeSeconds() },
        { "exp", ((DateTimeOffset)now.AddMinutes(15)).ToUnixTimeSeconds() },
        { "jti", Guid.NewGuid().ToString() }
    };
    var token = encoder.Encode(jwtHeader, payload);

    return token;
}

额外排查步骤

  • 使用JWT调试工具解析生成的JWT,检查头部、负载格式是否正确,并用对应公钥验证签名有效性。
  • 确认IRS应用注册状态为已激活,未激活应用会触发客户端验证失败。
  • 核对测试环境端点地址,避免使用生产环境URL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:33:10