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

PHP应用通过JWT连接DocuSign时“kid无效”错误求助

问题解答

核心问题回答

是的,JWT头部中的kid值完全等同于DocuSign的密钥对ID(Keypair ID),你在编码JWT时手动传入该值的做法是正确的。

错误原因分析

你遇到的解码错误,核心问题出在两个地方:

  1. 不必要的本地解码步骤:换取DocuSign访问令牌的流程中,不需要你自己本地解码JWT——这个验证工作是由DocuSign的OAuth服务器完成的,你只需要把生成的JWT发送给DocuSign的token端点即可。
  2. 公钥不匹配:即便你要本地验证,当前代码中使用的publicKey.key必须和签名用的私钥是配对的密钥对,同时kid要和该密钥对在DocuSign后台登记的ID一致,否则会出现kid无效的错误。

修正后的代码流程

1. 正确生成JWT(保留你的签名逻辑)

$now = time();
$payload = [
    'iss' => $clientId,
    'sub' => $apiUserId,
    'aud' => 'account-d.docusign.com', // 沙箱环境,生产环境用account.docusign.com
    'scope' => 'signature impersonation',
    'iat' => $now,
    'exp' => $now + 3600 // 1小时有效期,不要超过这个值
];
$privateKey = file_get_contents($privateKeyFilePath);
// 确认$keypairID是DocuSign后台生成的密钥对ID,和你上传的公钥对应
$jwt = JWT::encode($payload, $privateKey, 'RS256', $keypairID);

2. 发送请求到DocuSign获取访问令牌

移除本地解码的代码,替换为向DocuSign的OAuth token端点发送请求:

// 推荐用Guzzle等HTTP客户端,也可以用curl
$client = new \GuzzleHttp\Client();
try {
    $response = $client->post('https://account-d.docusign.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
            'assertion' => $jwt
        ]
    ]);
    $tokenData = json_decode($response->getBody(), true);
    // 拿到访问令牌:$tokenData['access_token']
    print_r($tokenData);
} catch (\Exception $e) {
    echo "获取DocuSign令牌失败: " . $e->getMessage();
}

额外注意事项

  • 确认$apiUserId是DocuSign用户的UUID(不是邮箱地址),可以在DocuSign后台用户详情页找到。
  • 确保你的DocuSign应用已经完成了授权:如果是个人测试,需要用管理员账号给应用授予权限;如果是企业场景,需要用户完成首次授权。
  • 私钥文件要确保服务器有读取权限,内容没有格式错误(要包含-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:38:19